2017-08-13 88 views
0

我明白PECS概念,爲什麼下面add()編譯和不編譯:創建一個泛型集合到一個不能添加指定的類型

List<? super ClassCastException> list = new ArrayList<>(); 
list.add(new ClassCastException()); // OK 
list.add(new Exception()); // Does not compile 

但不應下面是非法的呢?爲什麼不? (指定實例化時,我們不能添加超類型)

List<? super ClassCastException> list2 = new ArrayList<Exception>(); // Compiles 
                 ^
+2

因爲列表是List <?的子類型。超類ClassCastException>。 –

回答

1

讓我們來看看原因的第一段代碼是非法的:

List<? super ClassCastException> list = new ArrayList<>(); 
list.add(new Exception()); // Does not compile 

listList<? super ClassCastException>型的,即列表未知類型,即ClassCastException的父級。你不能把Exception放在那裏,因爲如果這個列表實際上是一個RuntimeExcept的列表呢? RuntimeException也是ClassCastException的父類,不是嗎? 而且你當然不能把Exception放在RuntimeException的列表中!

然而,這是不同的:

List<? super ClassCastException> list2 = new ArrayList<Exception>(); 

您可以指定什麼list2list2被宣告爲是ClassCastException的父類型的未知類型的列表。任何符合標準的列表都可以分配。

「但是還有其他的父類爲ClassCastException!」你說。那麼,是的,但是在一份任務說明中,我們關心list2的原始價值究竟是什麼?不。如果list2最初是ArrayList<RuntimeException>,那很好。我們仍然可以分配ArrayList<Exception>。這裏沒有矛盾。在第一段看到斜體字?如果您嘗試將Exception放入? super ClassCastException列表中,就會出現這種矛盾。雖然你不能指出這個賦值語句有什麼問題。

+0

瞭解,添加到有界列表與分配到有界參考。 – Andrejs

相關問題