2017-03-18 94 views
2

雖然learning Java generics我開始知道,通過協變,我們可以從結構中讀取項目,但是我們不能寫入任何內容,而且我們可以將項目寫入到結構中,但是我們不能從它讀取任何東西。在Java泛型的協變和反變量中的寫入

讓我們舉個例子:

List<? extends Number> myNums = new ArrayList<Integer>(); 
myNums.add(45L); // Covariance - compiler error 
List<? super Integer> myNums = new ArrayList<Integer>(); 
myNums.add(1); 
Number myNum = myNums.get(0); //Contravariance - compiler-error 

我所無法理解的是,爲什麼在這件事情被禁止?如果允許這種事情發生,我無法理解會出現什麼問題?

+0

newArrayList需要是新的ArrayList –

+1

這談論什麼可以出錯與協方差:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas- generics-implicitly-p?rq = 1 –

+0

實際上,你鏈接的文章正好解釋了這個問題。你對這些解釋有什麼具體問題嗎? – user140547

回答

3

您不能將Integer類的元素添加到List<? extends Number>中,因爲您不知道列表中元素的確切類型。它可能實際上是List<Double>。下一個例子中的邏輯相同。你從List<? super Integer>得到的可能有Object類型,而不是Number