我需要添加一個子屬性(ProductOption和ProductAttribute)的列表,它們是名爲Product的父對象的屬性。所有這三個類都擴展了一個抽象類CMS。避免使用泛型的instanceof
我想一般性地調用方法「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);
}
}
}
Product類(父)
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
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
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;
}
}
我還沒有被使用的年齡java的,但在C#中,你可以做像這樣的聲明: FatherType foo = new ChildType(); 和 列表< – Salaros 2012-08-17 12:29:16