31302


JAVAにおけるinterfaceのキャストについてです．  
下記のようなあるinterfaceを実装したMyClassを定義します．  
また，このIntegerをkey,interfaceのリストのArrayListをvalueとする`TreeMap <Integer,
ArrayList<MyInterface>>`を戻り値とする関数を与えます．これを用いて得た戻り値を`TreeMap <Integer,
ArrayList<MyClass>>`として扱うためのキャストを行いたいのですが，キャストを行うとエラーが出てうまくできません．  
方法がわからず困っております，どうぞご教授よろしくお願いします．

[code]

    class MyClass implements MyInterface{...};
    
    class A{
        public A(){
            TreeMap<Integer, ArrayList<MyClass>> myClassListMap 
                 = (TreeMap<Integer, ArrayList<MyClass>>) getMyInterfaceListMap();
        }
        TreeMap<Integer, ArrayList<MyInterface>> getMyInterfaceListMap(){...};
    }
    
[/code]


CC BY-SA 3.0
2016-12-21T23:45:27.940
31301
2016-12-22T02:08:34.417
2016-12-21T23:54:00.767
13272
13272
question
java
JAVA:Interfaceのキャスト


`MyClass` は `MyInterface` のサブタイプなので、キャスト(ダウンキャスト)が可能です。

[code]

    MyInterface obj1 = .....;
    MyClass obj2 = (MyClass)obj1;
    
[/code]

一方、 `ArrayList<MyClass>` と `ArrayList<MyInterface>` にはそのような関係はないのでキャスト不能です。  
例えば、`String`を`Integer`にキャストできないのと同様です。

[code]

    String str = "hello";
    Integer num = (Integer)str; // コンパイルエラー
    
    ArrayList<MyInterface> obj = new ArrayList<>();
    ArrayList<MyClass> obj2 = (ArrayList<MyClass>) obj; // コンパイルエラー
    
[/code]

このような性質を「Javaのジェネリクスは非変である」(下記リンク先参照)と表現したりします。

  * [Java ジェネリクスのポイント - Qiita](http://qiita.com/pebblip/items/1206f866980f2ff91e77)

(このリンクの他、多くの方が日本語で解説を書かれています。"generics 共変"といったキーワードで検索し、分かりやすい解説を探してみてください。)

* * *

質問文中のコード片だけでは真に行いたいことが不明ですが(つまり本来為すべきことはキャストできるようにすることではない、と私は考えているのですが)、もしかしたら行いたいことは次のような形かもしれません:

[code]

    class A<T extends MyInterface> {
        public A() {
           TreeMap<Integer, ArrayList<T>> myClassListMap = getMyInterfaceListMap();
        }
    
        TreeMap<Integer, ArrayList <T>> getMyInterfaceListMap() {...}
    }
    
[/code]


CC BY-SA 3.0
2016-12-22T02:08:34.417
31302
2016-12-22T02:08:34.417
2808
31301
answer