限制外卡类型属性的getter和setter

时间:2013-08-29 09:18:20

标签: java generics

我有一个包含List<? extends BaseType>的课程。现在BaseType可以有两个子类型SubTypeASubTypeB。在运行时,列表可以是List<SubTypeA>List<SubTypeB> getter setter 的签名应如何查找此属性?

class ListHolder{

 private List<? extends BaseType> listOfBaseType;

 //getter and setter for listOfBaseType

}

我们是否必须在getter中声明type参数?

2 个答案:

答案 0 :(得分:3)

public List<? extends BaseType> getListOfBaseType() {
    return listOfBaseType;
}
public void setListOfBaseType(List<? extends BaseType> listOfBaseType) {
    this.listOfBaseType = listOfBaseType;
}

答案 1 :(得分:3)

这取决于,如果你想坚持超类只是这样做:

通用输入1

class ListHolder{

 private List<? extends BaseType> listOfBaseType;

 //getter and setter for listOfBaseType
 public List<? extends BaseType> getListOfBaseType(){...}
 public void setListOfBaseType(List<? extends BaseType>){...}

}

例1

ListHolder lh = new ListHolder();
lh.setListOfBaseType(new ArrayList<BaseTypeA>()); //OK
lh.setListOfBaseType(new ArrayList<BaseTypeB>()); //OK
List<BaseTypeB> l = lh.getListOfBaseType(); //KO too specific
List<? extends BaseType> l = lh.getListOfBaseType(); //OK

通用输入2

如果你想要强大的控制和安全的转换(尽管这个你不能混淆类型):

class ListHolder<T extends BaseType>{

 private List<T> listOfBaseType;

 //getter and setter for listOfBaseType
 public List<T> getListOfBaseType(){...}
 public void setListOfBaseType(List<T>){...}

}

例2

ListHolder<BaseTypeA> lh = new ListHolder<BaseTypeA>();
lh.setListOfBaseType(new ArrayList<BaseTypeA>()); //OK
lh.setListOfBaseType(new ArrayList<BaseTypeB>()); //KO will not compile
List<BaseTypeB> l = lh.getListOfBaseType(); //KO will not compile
List<BaseTypeA> l = lh.getListOfBaseType(); //OK no need to cast

通用输入3

如果您想在保持安全的同时获得更大的灵活性:

class ListHolder{

 private HashMap<Class<? extends BaseType>, List<? extends BaseType> hashListOfBaseType;

 //getter and setter for listOfBaseType
 public <T extends BaseType> List<T> getListOfBaseType(Class<T> clazz){
      return hashListOfBaseType.get(clazz);
 }

 public <T extends BaseType> void setListOfBaseType(Class<T> clazz, List<T> list){
      hashListOfBaseType.put(clazz, list);
 }

}

例3

ListHolder lh = new ListHolder();
lh.setListOfBaseType(BaseTypeA.class, new ArrayList<BaseTypeA>()); //OK
lh.setListOfBaseType(BaseTypeB.class, new ArrayList<BaseTypeB>()); //OK
List<BaseTypeA> l = lh.getListOfBaseType(BaseTypeA.class); //OK
List<BaseTypeB> l = lh.getListOfBaseType(BaseTypeB.class); //OK

一切都取决于你需要什么......详细说明我可以更具体