我有以下通用介面和實作類:
public interface DataInterface<T> {
T getData();
void printData();
}
public class IntegerData implements DataInterface<Integer> {
private Integer value;
public IntegerData(Integer value) {
this.value = value;
}
@Override
public Integer getData() {
return null;
}
@Override
public void printData() {
System.out.println(this.value);
}
}
這里是我使用該類的代碼:
public class Main {
public static void main(String[] args) {
List<IntegerData> dataList = new ArrayList<>();
dataList.add(new IntegerData(1));
doSomething(dataList); <-- Compiler error
//this work
doSomething(Collections.unmodifiableList(dataList));
doSomething(new ArrayList<>(dataList));
}
private static void doSomething(List<DataInterface<?>> dataList) {
for (DataInterface<?> data : dataList)
data.printData();
}
}
如果我嘗試使用 List 型別呼叫 doSomething 方法,編譯器會抱怨“Main 型別中的方法 doSomething(List<DataInterface<?>>) 不適用于引數 (List)”。
但是,如果我包裝我的特定串列或創建一個新串列,那么它就可以作業。我想知道為什么直接呼叫不起作用。是什么原因?
uj5u.com熱心網友回復:
A List<IntegerData>orList<DataInterface<Integer>>與 不兼容List<DataInterface<?>>,因為我也可以將 a 添加DataInterface<String>到后者。解決方案是使用擴展:
private static void doSomething(List<? extends DataInterface<?>> dataList)
這將防止向串列中添加任何內容(除了null),因此可以安全使用。
通過包裝串列,泛型型別由于型別推斷而改變。如果您將其分配給使用var它的變數也會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426115.html
上一篇:表測驗Go泛型
