2017-10-05 37 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仿製藥java中的變異並不按預期工作

+1

看到的Javadoc您正在使用https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList方法。 html#get(int) –

+2

爲什麼'get(0)'完全拋出一個錯誤? –

+0

正在閱讀這篇文章(https://dzone.com/articles/covariance-and-contravariance),說如果List類已經放置了一個綁定,如?超T,那麼我將無法調用get(0),因爲編譯器會拋出錯誤。 – jtkSource

回答

4

沒有編譯時錯誤,因爲println可以採取任何Object(這甚至是保證與?兼容)。

你正在尋找的錯誤是

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

謝謝我錯過了:)所以它真的意味着它不能分配給一個類型! – jtkSource

+0

不是沒有類型演員,沒有。 – Thilo

+0

@jtkSource:「所以它真的意味着它不能分配給一個類型」除了'Object' – newacct