1

を含むクラスがありますList<? extends BaseType>。と の 2つのサブタイプBaseTypeを持つことができるようになりました。実行時には、リストは または のいずれかになります。gettersetterの署名は、このプロパティをどのように探すべきですか?SubTypeASubTypeBList<SubTypeA>List<SubTypeB>

class ListHolder{

 private List<? extends BaseType> listOfBaseType;

 //getter and setter for listOfBaseType

}

ゲッターで型パラメーターを宣言する必要がありますか?

4

2 に答える 2

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

すべてはあなたが必要とするものに依存します....詳しく説明すると、より具体的になることができます

于 2013-08-29T09:26:42.047 に答える
3
public List<? extends BaseType> getListOfBaseType() {
    return listOfBaseType;
}
public void setListOfBaseType(List<? extends BaseType> listOfBaseType) {
    this.listOfBaseType = listOfBaseType;
}
于 2013-08-29T09:20:37.973 に答える