[英]Why does this generic piece of code give a compilation error
有人可以解釋一下為什么行不行嗎? 12給出一個編譯時錯誤?
package com.soflow;
import java.util.List;
public abstract class Shape {
}
class Rectangle extends Shape {
private int x, y, width, height;
public void addRectangle(List<? extends Shape> shapes) {
shapes.add(0, new Rectangle()); // compile-time error!
}
}
我在這里無法理解的是,為什么不允許我將形狀的子類型添加到“形狀”列表中? 為什么在編譯時抱怨呢? 我相信編譯器可以看到Rectangle和Shape之間存在IS-A關系。 我現在很困惑。 任何幫助是極大的贊賞。
謝謝,Maneesh Sharma
任何幫助將不勝感激
List<? extends Shape>
List<? extends Shape>
表示參數化了Shape
任何子類的列表,而不是接受shape的任何子類作為其內容的列表。 那只是一個List<Shape>
。
想象一下, shapes
在運行時是List<Triangle>
。 顯然這將是一個錯誤,因為您無法將Rectangle添加到List<Triangle>
。
但是,讓我們考慮為什么List<Rectangle>
, List<Shape>
或List<? super Shape>
List<? super Shape>
在這里是正確的。 在第一種情況下,很明顯: List<Rectangle>
將接受Rectangle
實例。 在第二種方法中,由於所有Rectangle
實例都可以分配給Shape
,因此可以將它們放入List<Shape>
。 在第三種情況下,綁定通過成為Shape
的超類來保證列表將接受Shape。
記住以下短語:“生產者擴展,消費者超級”。 這里的列表是添加項的使用者 ,因此它必須是super
。
變更List<? extends Shape> shapes
List<? extends Shape> shapes
到List<? super Shape> shapes
List<? super Shape> shapes
或List<Shape> shapes
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.