38629


Javaのジェネリック型についてなのですが、あるジェネリッククラスをインスタンス化したときに、そのジェネリッククラスのパラメータを、違うジェネリッククラスにすることは可能なのでしょうか？


CC BY-SA 3.0
2017-10-11T18:07:53.537
38613
2017-11-17T00:55:27.443
2017-11-17T00:55:27.443
19110
22984
question
java
ジェネリッククラスをインスタンス化するときのパラメータを別のジェネリッククラスにすることは可能か？


「ジェネリッククラスのパラメータを、違うジェネリッククラスにする」というのが`new HashMap<String,
ArrayList<Integer>>()`のようなことを指すのであれば、このように書けば可能です。


CC BY-SA 3.0
2017-10-11T23:02:07.307
38615
2017-10-11T23:02:07.307
8078
38613
answer


### 問題の想定: 例えば、次のようなケースなのかなと思っています。

[code]

    List<Number> l = Arrays.asList(1,2,3);
    // 以下をやりたいけどエラーになる！！
    List<Integer> ints = (List<Integer>) l;
    
[/code]

### まず: 最悪キャストすれば動く

確実に問題を起こさないとわかっていて、コードを通すことが目的ならば、例えば次のようにできます。(warning が出ますが、 warning
はアノテーションなどで抑制をやろうと思えばできる)

[code]

    List<Number> l = Arrays.asList(1,2,3);
    List asRaw = (List) l;
    List<Integer> ints = (List<Integer>) asRaw;
    
[/code]

### ただ、実際には

ただ、これをやってしまうと、「ジェネリック型の型安全性」を放棄してしまうことになるので、以下のように、ジェネリックとして取り扱いながらなおすのがよいのでは、と思っています。

直し方例:  
1\. そもそも `List<Integer>` を利用するようにする。  
2\. 新しい `List<Integer>` を作成し、元リストから中身を一つずつ取り出し、 instanceof で Integer
にキャスト可能かどうかを判断しながら、新しい方に詰めなおす.

もしくは、ジェネリックメソッド・クラスの定義の仕方の問題かもしれないので、今実際に詰まっているコードを追記いただくと、より適切な回答を記載できるようになるのではないか、と思っています。


CC BY-SA 3.0
2017-10-12T05:40:11.760
38629
2017-10-13T00:37:58.210
2017-10-13T00:37:58.210
754
754
38613
answer