[英]when to use extends or implements Comparable (Java) ? + why I cannot create object
[英]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.