2013-05-03 41 views
0

对不起,我知道以前也有类似的问题,但没有一个解决我当前的问题。当从MyAbstractParameter投射到T时,未经检查的投射警告

我现在有这样的事情:

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")

回答

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); 
} 
+0

我知道,但我想这样做,其他类:'名单 otherList = myClass.getList()',它不让我,我不得不将它更改为'List <?扩展MyAbstractParameter> otherList',这是我想避免的。 – Goodwine 2013-05-03 21:04:22

+0

或者这是正确的事情吗? – Goodwine 2013-05-03 21:05:07

+0

如果你想返回一个调用者可以添加任何MyAbstractParameter实例的列表,那么你应该创建一个'List '的副本并返回它。否则,您应该返回一个列表。 – 2013-05-03 21:07:55