2012-05-28 38 views
1

我有以下類別:在return語句在仿製藥使用鑄造

public class Base { 
    public int someMethod(){...} 
} 

public class Derrived extends Base { 
    @Override 
    public int someMethod(){...} 
} 

還我一個方法返回List<Base>

List<Base> method() { 
    return fetch(); 
} 

方法fetch()返回List<? extends Base>但實際上它擁有實例的列表Derrived class

List<? extends Base> fetch() {} 

但是定義方法method()的代碼將不會編譯。它需要鑄造到List<Base>。爲什麼我需要施放它,如果我始終可以將該集合的實例視爲基類的實例?

回答

5

A List<? extends Base>List<Base>不是一回事,就像一串香蕉不是水果籃一樣。

考慮:

List<Derived> x = new ArrayList<Derived>(); 

// This is valid... 
List<? extends Base> y = x; 

// This is what you *want* to be valid 
List<Base> z = y; 

z.add(new Base()); 

// This looks fine at compile-time... but what would you expect it to do? 
Derived d = x.get(0); 

這是一件事治療List<Derived>的所有現有元素爲Base實例 - 但你不能添加一個BaseList<Base>,而你可以加1到List<Derived>。並非每個List<Derived>都是List<Base>

+0

在我的情況下(這種方法的返回類型必須是「列表」類型的)返回類型'List '是否是一個很好的解決方案? – maks

+0

@ maks:不,它不是。如果可以的話,改變你的方法的返回類型會更好。 –

1

你不能這樣做,因爲不能保證有人不會嘗試向集合中插入不同子類Base的對象。

然後會發生什麼?

它會看起來好的,但你基本上試圖在同一個集合中使用兩種不同類型的對象,正如你所知,這是不允許的。