讓我們來看看原因的第一段代碼是非法的:
List<? super ClassCastException> list = new ArrayList<>();
list.add(new Exception()); // Does not compile
list
是List<? super ClassCastException>
型的,即列表未知類型,即ClassCastException
的父級。你不能把Exception
放在那裏,因爲如果這個列表實際上是一個RuntimeExcept
的列表呢? RuntimeException
也是ClassCastException
的父類,不是嗎? 而且你當然不能把Exception
放在RuntimeException
的列表中!
然而,這是不同的:
List<? super ClassCastException> list2 = new ArrayList<Exception>();
您可以指定什麼list2
? list2
被宣告爲是ClassCastException
的父類型的未知類型的列表。任何符合標準的列表都可以分配。
「但是還有其他的父類爲ClassCastException
!」你說。那麼,是的,但是在一份任務說明中,我們關心list2
的原始價值究竟是什麼?不。如果list2
最初是ArrayList<RuntimeException>
,那很好。我們仍然可以分配ArrayList<Exception>
。這裏沒有矛盾。在第一段看到斜體字?如果您嘗試將Exception
放入? super ClassCastException
列表中,就會出現這種矛盾。雖然你不能指出這個賦值語句有什麼問題。
因爲列表是List <?的子類型。超類ClassCastException>。 –