2013-05-03 44 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