簡體   English   中英

Java:“? 擴展我”不能轉換為“? 延伸我”

[英]Java: “? extends I” cannot be converted to “? extends I”

這段代碼:

interface I {}

public class Test {

    TableView<? extends I> table;

    Test(ObservableList<? extends I> list) {
        table = new TableView<>();
        table.setItems(list);
    }
}

...產生此消息:

error: method setItems in class TableView<S> cannot be applied to given types;
       table.setItems(list);
 required: ObservableList<CAP#1>
 found: ObservableList<CAP#2>
 reason: argument mismatch; ObservableList<CAP#2> cannot be converted to ObservableList<CAP#1>
 where S is a type-variable:
   S extends Object declared in class TableView
 where CAP#1,CAP#2 are fresh type-variables:
   CAP#1 extends I from capture of ? extends I
   CAP#2 extends I from capture of ? extends I

兩個相同類型之間如何存在類型不匹配? 我想念什么?

在Java泛型中, ? 通配符不能相同,因為它們代表未知類型。 未知類型不能等於其他某些未知類型。

如果要使類型匹配,則必須在Test類上定義一個通用類型參數,並在整個類中對其進行引用。

public class Test<T extends I> {

    TableView<T> table;

    Test(ObservableList<T> list) {
        table = new TableView<>();
        table.setItems(list);
    }
}
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error

“由於我們不知道c的元素類型代表什么,因此我們無法向其添加對象。add()方法采用類型E(即集合的元素類型)的參數。當實際類型參數為?時,它將代表某種未知類型。傳遞給我們的任何參數都必須是該未知類型的子類型。由於我們不知道是什么類型,因此無法傳遞任何內容。唯一的例外是null,它是一個成員每種類型。

另一方面,給定一個List,我們可以調用get()並利用結果。 結果類型是未知類型,但我們始終知道它是一個對象。 因此,可以安全地將get()的結果分配給Object類型的變量,或者將其作為參數傳遞給需要Object類型的位置。”( http://docs.oracle.com/javase/tutorial/extra/generics /wildcards.html

不要在變量聲明中使用“?extended I”。 它沒有任何語義價值,是問題的根源。 您會看到編譯器拒絕假定'?' 在一個聲明中與“?”相同 在另一個。 這是自然的,因為不能保證它們是。 我將省去“?” 共:

interface I {}

public class Test {

    TableView<I> table;

    Test(ObservableList<? extends I> list) {
        table = new TableView<>();
        table.setItems(list);
    }
}

暫無
暫無

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

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