簡體   English   中英

在 Java 中導致編譯錯誤的上限通配符

[英]Upper bounded wildcards causing compilation error in Java

我不明白為什么我會收到這些編譯錯誤:

1:

類型列表中的 add(capture#1-of ? extends Exec.Bird) 方法不適用於參數 (Exec.Sparrow)

2:

類型列表中的方法 add(capture#2-of ? extends Exec.Bird) 不適用於參數 (Exec.Bird)

static class Bird{}
static class Sparrow extends Bird{}

public static void main(String[] args){
    List<? extends Bird> birds = new ArrayList<Bird>();
    birds.add(new Sparrow()); //#1 DOES NOT COMPILE
    birds.add(new Bird());// //#2 DOES NOT COMPILE
}

List<? extends Bird> List<? extends Bird>您實際上說的是屬於 Bird 子類型的任何類型,或者更准確地說,是屬於Bird子類型的未知但特定類型 這與說擴展Bird每種類型不同

那是?意思? 可以是Sparrow ,也可以是Blackbird 如果您嘗試將Sparrow添加到只能包含Blackbird的列表中,它將不起作用。 出於同樣的原因,您不能將Bird添加到可能Sparrow列表的列表中。

為了使事情正常工作,您只需將列表的聲明更改為:

List<Bird> birds = new ArrayList<>();

或使用下限:

List<? super Bird> birds = new ArrayList<>();

關於這個下限示例:聲明實際上是說任何類型是Bird或其超類之一 這意味着您可以安全地添加SparrowBird ,因為兩者都符合這些標准。

一般來說,你應該使用? super ... ? super ...當你寫到列表中時,和? extends ... ? extends ...當您從列表中閱讀時。 如果您同時閱讀和寫作,則不應使用邊界。


這個答案提供了關於泛型的非常有用的信息。 你絕對應該閱讀它。

您可以像這樣實例化birds列表:

List<Bird> birds = new ArrayList<>();

完整代碼:

import java.util.ArrayList;
import java.util.List;

public class Main {
    static class Bird{}
    static class Sparrow extends Bird{}

    public static void main(String[] args) {
        List<Bird> birds = new ArrayList<>();
        birds.add(new Sparrow());
        birds.add(new Bird());
    }
}

暫無
暫無

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

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