2012-03-23 9 views
0

コードはhttps://github.com/timp21337/java-generics-exampleサブクラス化されたオブジェクトのサブクラス化されたコレクションを、スーパークラスのスーパークラスオブジェクトのコレクションにキャストするのはなぜですか?

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.shingのサブクラスですか?

+3

これはあなたの質問に答えると思います。 http://stackoverflow.com/q/6044329/422353 – madth3

+0

+1よく書かれた質問です。最初に回答を検索しない場合は-1です。 net:0 –

+0

Thanks @ madth3、はい、特に TimP

答えて

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

私は申し訳ありませんが、経験のない誰かが、その2行のコードだけであなたの例をよりよく理解できるかどうかはわかりません。 – madth3

+0

barは、fooによって誤ってアクセスされる可能性のある整数を受け入れることができるようになりました。ありがとう@newacct – TimP

関連する問題