簡體   English   中英

為什么這段通用代碼會產生編譯錯誤

[英]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> shapesList<? super Shape> shapes List<? super Shape> shapesList<Shape> shapes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM