首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用泛型避免instanceof

使用泛型避免instanceof
EN

Stack Overflow用户
提问于 2012-08-17 20:24:57
回答 5查看 734关注 0票数 1

我需要添加一个子属性(ProductOption和ProductAttribute)列表,它们是一个名为Product的父对象的属性。这三个类都扩展了一个抽象类CMS。

我想泛泛地调用这个方法"attachChildToParent“,但是我推迟了instanceof,并将其强制转换为Product,从而推迟了不可避免的调用。

有没有一种方法可以通用地写这段代码,这样我就可以避免强制转换?

要测试:

代码语言:javascript
复制
package puzzler;

import java.util.ArrayList;
import java.util.List;

public class Tester {
    public static void main(String[] args) {
        Product p = new Product();
        ProductAttribute pa = new ProductAttribute();
        ProductOffering po = new ProductOffering();

        List<ProductAttribute> lpa = new ArrayList<ProductAttribute>();
        List<ProductOffering> lpo = new ArrayList<ProductOffering>();

        attachChildToParent(lpa, p);
    }

    static void attachChildToParent(List<? extends CMS> listChild, Product parent) {
        for (CMS cmsItem : listChild) {
            parent.attach(cmsItem);         
        }
    }
}

Product类(父类)

代码语言:javascript
复制
package puzzler;

import java.util.List;

abstract class CMS {
    String node;
}
public class Product extends CMS {
    List<ProductAttribute> lpa;
    List<ProductOffering> lpo;

    public List<ProductAttribute> getLpa() {
        return lpa;
    }

    public void setLpa(List<ProductAttribute> lpa) {
        this.lpa = lpa;
    }

    public List<ProductOffering> getLpo() {
        return lpo;
    }

    public void setLpo(List<ProductOffering> lpo) {
        this.lpo = lpo;
    }

    public void attach(ProductAttribute childNode) {
        this.getLpa().add(childNode);
    }

    public void attach(ProductOffering childNode) {
        this.getLpo().add(childNode);
    }

    //  I want to avoid this.  Defeats the purpose of generics.
    public void attach(CMS cms) {
        if (cms instanceof ProductOffering) {
            this.getLpo().add((ProductOffering) cms);
        } else         {
            if (cms instanceof ProductAttribute) {
                this.getLpa().add((ProductAttribute) cms);
            }
        }
    }
}

子类1

代码语言:javascript
复制
package puzzler;

import puzzler.CMS;

public class ProductAttribute extends CMS {
    String node;

    public String getNode() {
        return node;
    }

    public void setNode(String node) {
        this.node = node;
    }
}

子级2

代码语言:javascript
复制
package puzzler;

import puzzler.CMS;

public class ProductOffering extends CMS {
    String node;

    public String getNode() {
        return node;
    }

    public void setNode(String node) {
        this.node = node;
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-17 20:31:09

您可以通过使用访问者模式来解决这个问题:在CMS类中,添加一个新的(抽象)方法attachTo(Product parent)。在每个子类中,您可以实现此方法来调用父类上的attach,并将解析正确的函数。

票数 5
EN

Stack Overflow用户

发布于 2012-08-17 20:35:38

委派给子类:

代码语言:javascript
复制
public void attach(CMS cms) {
    cms.callAdd(this);

}

在CMS上添加:

代码语言:javascript
复制
public abstract void callAdd(Product product);

在ProductOffering上添加:

代码语言:javascript
复制
public void callAdd(Product product) {
   getLpo().add(this)       
}

ProductAttribute也是如此……

票数 2
EN

Stack Overflow用户

发布于 2012-08-17 20:33:36

覆盖?

代码语言:javascript
复制
public void attach(ProductOffering cms) {
   this.getLpo().add(cms);
}

public void attach(ProductAttribute cms) {
   this.getLpa().add(cms);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12005769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档