避免使用泛型的instanceof

Edg*_*ase 1 java generics

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

我想一般性地调用方法"attachChildToParent",但是我推迟了不可避免的事情instanceof并推迟了产品.

有没有办法我可以写这个一般,所以我可以避免演员表?

去测试:

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);         
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产品类(父级)

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班1

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班2

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ett 5

您可以使用访问者模式解决转换:在您的CMS类中,添加一个新的(抽象)方法attachTo(Product parent).在每个子类中,您可以实现此方法以在父级上调用attach,并且将解析右侧函数.