2012-03-30 16 views
15

2つのリストをデカールしたい: 最初は整数のリストです。私はそれを次のように決めます:ジェネリックリストの宣言が異なるのはなぜですか?

List<Integer> ints= Arrays.asList(1,2,3); 

うまくいきます。

2番目はオブジェクトのリストです。私はそれを次のように宣言します:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

しかし私はそれを書いたらすぐにエクリプスを与えます。エラーは次のとおりです。

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

私は

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

を書く場合は代わりにそれが正常に動作します。

私は理由を理解できません。

答えて

14

this post on stackoverflowをご覧ください。実引数に基づいて

15.12.2.7推測する型引数

スーパータイプの制約T:> XソリューションはT上のいくつかのような制約を、私たちができる考えるとXの1 のスーパータイプであることを意味し タイプのパラメータは、すべての制約のメンバーでなければならないため、それぞれの制約によって暗示されるスーパータイプのセットを と交差させます。我々は、次に、交差点

StringDoubleInteger間の最も制限型交差点が両方のインタフェースComparableSerializable にある最も具体的なタイプを選択することができます。あなたはそれはあなたが

明らか
List<Object> objs = new List<T extends Comparable<?>, Serializable> 

を行っているかのようにそれがあるimplements Comparable<?>, Serializable .ThenするTを推測

Arrays.asList(1,2.13,"three"); 

を書くときに、これは許可されていません。あなたが明示的Objectを指定する一方、
何の推論が

+0

非常に良い説明をありがとう。このような混乱の場合には、これはゴールデンルールになります。 –

2

利用していない

Arrays.<Object>asList(1,2.13,"three"); 

を使用して、これは完璧な

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

出力動作します: [10、20.32、テスト]

+3

これは問題ありませんが、コンパイラに関する限り、 'List 'は 'List <?オブジェクトを拡張する>、OPは 'List ' – Bohemian

+1

-1を必要とするかもしれません。 asList(1,2.13、 "three") 'はうまく動作します。問題は、コンパイラが解をハックする方法ではなく、 'Object'を推測することに失敗した理由でした。 –

関連する問題