2017-10-05 2 views
0
List<? super Number> myNumsContra = new ArrayList<Number>(); 
    myNumsContra.add(2.0F); 
    myNumsContra.add(2); 
    myNumsContra.add(2L); 

    System.out.println(myNumsContra.get(0)); //should throw error 

ジェネリックの反則ルールによると、上記のget(0)コールはコンパイルエラーを投げます。しかし、私はこれが起こっているとは思わない。私が逃したものはありますか?私はJava-8を使用していますジェネリックのコントラバナンスは期待どおりに動作しません。

+1

では、あなたがhttps://docs.oracle.com/javase/7/docs/api/java/util/ArrayListを使用しているメソッドのjavadocを参照してください。 html#get(int) –

+2

'get(0)'は正確にエラーを投げるべきですか? –

+0

Listクラスがバインドされているかどうかを示すこの記事(https://dzone.com/articles/covariance-and-contravariance)を読んでいましたか?スーパーTの場合、コンパイラがエラーをスローするので、get(0)を呼び出すことができません。 – jtkSource

答えて

4

printlnObject(どちらでも?と互換性があります)でもかまいませんので、コンパイル時エラーはありません。

あなたが探しているエラーが

Number x = myNumsContra.get(0); 
// does not compile, because we cannot know this is really a `Number`. 
+0

私はそれを逃した:)本当にそれはタイプに割り当てることができないことを意味します! – jtkSource

+0

タイプキャストなしではありません。 – Thilo

+0

@jtkSource: "それは本当にそれがタイプに割り当てることができないことを意味する" – newacct

関連する問題