2013-08-29 3 views
0

У меня есть класс, который содержит List<? extends BaseType>. В настоящее время BaseType может иметь два подтипов: SubTypeA и SubTypeB. Во время выполнения список может быть либо List<SubTypeA>, либо List<SubTypeB>. Как должна подпись геттера и setter найти этот объект?Getter и setter для свойства ограниченного типа дикой карты

class ListHolder{ 

private List<? extends BaseType> listOfBaseType; 

//getter and setter for listOfBaseType 

} 

Нужно ли объявлять параметр типа в геттере?

+0

какова цель вашего класса ? Как вы его используете? –

+0

Как и любой другой аксессуар на самом деле ... – sp00m

+2

Вы могли бы позволить Eclipse генерировать геттер/сеттер для вас? – sanbhat

ответ

3

Это зависит от того, если вы хотите придерживаться суперкласса просто сделать это таким образом:

Generic набрав 1

class ListHolder{ 

private List<? extends BaseType> listOfBaseType; 

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

} 

Exemple 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 

Generic типирование 2

Если вы хотите сильный контроль и безопасное преобразование (хотя с этим вы не можете смешивать типы):

class ListHolder<T extends BaseType>{ 

private List<T> listOfBaseType; 

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

} 

Exemple 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); 
} 

} 

Exemple 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 

Все зависит от того, что вам нужно .... сложный, то я могу быть более конкретным

+0

«хотя с этим вы не можете смешивать типы» - Что вы подразумеваете под этим? Как вы можете смешивать типы в первом случае? – Geek

+0

Смешайте в смысле, вы говорите о 'subTypeA' и' subTypeB'? –

+0

@ Geek Я немного объяснил примеры, надеюсь, это прояснит мою мысль – TecHunter

3
public List<? extends BaseType> getListOfBaseType() { 
    return listOfBaseType; 
} 
public void setListOfBaseType(List<? extends BaseType> listOfBaseType) { 
    this.listOfBaseType = listOfBaseType; 
} 
Смежные вопросы