我目前有这样的事情:
abstract class MyAbstractParameter{ /* Some methods/parameters */ }
class MyParameter extends MyAbstractParameter { /*more methods/parameters*/ }
abstract class MyAbstractClass<T extends MyAbstractParameter> extends Thread{
private List<MyAbstractParameter> list;
public MyAbstractClass(List<MyAbstractParameter> list) { this.list = list; }
public List<MyAbstractParameter> getList() { return list; }
public void run() {
for(MyAbstractParameter e : list) {
doStuffWithList((T) e); // WARNING IS HERE WHEN CASTING! ! !!
}
}
public abstract void doStuff(T element);
}
class MyClass extends MyAbstractClass<MyParameter> {
public MyClass(List<MyAbstractParameter> list) { super(list); }
public void doStuff(MyParameter element) { /* does something */ }
}
我希望方法getList()
始终返回List<MyAbstractParameter>
,但确实如此,它会给我这个警告,我明白其背后的原因是如果我发送一个列表MyOtherParameter extends MyAbstractParameter
,演员会失败,我会哭。
所以我决定选择private List<? extends MyAbstractParameter> list;
,但我必须修改所有内容,以便<? ...>
没有问题。
那么......如果这样做会有另一种方式,同时避免修改所有内容吗?
我的意思是......就像在MyAbstractClass
中做某事而不使用@SuppressWarning("unchecked")
。
答案 0 :(得分:4)
如果列表中的每个元素都应该是T的实例,那么列表应该是List<T>
:
abstract class MyAbstractClass<T extends MyAbstractParameter> extends Thread {
private List<T> list;
public MyAbstractClass(List<T> list) { this.list = list; }
public List<T> getList() { return list; }
public void run() {
for (T e : list) {
doStuffWithList(e);
}
}
public abstract void doStuff(T element);
}