2012-03-23 66 views
0

代碼也是在https://github.com/timp21337/java-generics-example爲什麼在Java中不允許將子類對象的子類集合轉換爲超類對象的超類集合?

package a; 

import java.util.List; 

public interface Container<T> { 
    List<T> getThings(); 
} 

public class ContainerContainer { 
    public Container<Thing> getThingContainer() { 
    return new ThingContainer<Thing>(); 
    } 
} 

public class ThingContainer<T extends a.Thing> implements Container<T> { 
    @Override 
    public List<T> getThings() { 
    return null; 
    } 
} 

public class Thing { 
} 

套餐B

package b; 
import java.util.List; 

public class ContainerContainer extends a.ContainerContainer { 
    ThingContainer<Thing> thingContainer = new ThingContainer<Thing>(); 
    @SuppressWarnings("unchecked") 
    public a.Container<a.Thing> getContainer() { 
    return (a.Container<a.Thing>)(Object)thingContainer; //YUCK 
    } 
} 

public class ThingContainer<T extends a.Thing> 
    implements a.Container<T> { 
    @Override 
    public List<T> getThings() { 
    return null; 
    } 
} 

public class Thing extends a.Thing { 
} 

我的問題是,爲什麼我有要挾b.ThingContainer(上面注YUCK)當它的一個子類。 ThingContainer和它包含的東西是a.Thing的子類?

+3

我認爲這回答你的問題。 http://stackoverflow.com/q/6044329/422353 – madth3 2012-03-23 00:14:56

+0

+1爲一個寫得很好的問題; -1不先搜索答案;淨:0 – 2012-03-23 01:02:24

+0

謝謝@ madth3,是特別是鏈接到 TimP 2012-03-23 10:19:37

回答

1

讓我們考慮一個更簡單的例子,刪除所有不相關的細節。 (在此,代替b.Thing我們將使用String,並且代替a.Thing我們將使用Object; StringObject一個亞類中,所以它是類似代替a.Container,我們將使用List容器的子類是無關緊要的,如。你會看到的。)如果你能理解爲什麼這個例子不起作用,你會理解你的問題。

List<String> foo = new ArrayList<String>(); 
List<Object> bar = foo; // why doesn't this work? 
+0

我很抱歉,但我不確定沒有經驗的人會用這兩行代碼更好地理解您的示例。 – madth3 2012-03-23 16:30:44

+0

因爲bar現在可以接受可能通過foo錯誤訪問的整數。謝謝@newacct – TimP 2012-03-24 00:55:54

相關問題