我正在嘗試過濾實作介面的物件串列。我正在嘗試為所有類創建一個通用方法。
就像是:
interface SomeInterface {
String getFlag();
}
class SomeObject implements SomeInterface {
public String getFlag() {
return "X";
}
}
List<SomeObject> someObjectList = new ArrayList<>();
// Compilation error here
List<SomeObject> filterList = filterGenericList(someObjectList, "X");
private List<?> filterGenericList(List<? extends SomeInterface> objects, String flag) {
return objects.stream()
.filter(it -> it.getFlag().equals(flag))
.collect(Collectors.toList());
}
如何避免編譯錯誤?
Incompatible types.
Found: 'java.util.List<capture<?>>',
Required: 'java.util.List<SomeObject>'
uj5u.com熱心網友回復:
當您回傳時List<?>,這意味著該方法回傳一些未知型別的串列。Java 不知道它與輸入串列是同一型別的串列。要發出信號,請創建一個泛型型別T并將輸入和輸出串列都設定為List<T>.
private <T extends SomeInterface> List<T> filterGenericList(List<T> objects, String flag) {
return objects.stream()
.filter(it -> it.getFlag().equals(flag))
.collect(Collectors.toList());
}
uj5u.com熱心網友回復:
無界通配符 <?>也稱為未知型別是一種告訴編譯器無法預測泛型型別的方法,因此編譯器將不允許將未知型別串列分配給串列,SomeObject因為無法確保此分配是安全的。
如果您有一個屬于不同類的物件串列以實作SomeInterface區分它們,您可以顯式地將目標類的實體Class<T>作為引數傳遞給方法。
似乎您正試圖通過利用方法來重新發明相同的機制getFlag()。它看起來不可靠,因為沒有什么可以阻止您打錯字或意外地getFlag()在兩個不同的類中實作,從而回傳相同的值。
private <T extends SomeInterface> List<T> filterGenericList(List<? extends SomeInterface> objects,
Class<T> targetClass) {
return objects.stream()
.filter(it -> targetClass.isAssignableFrom(it.getClass()))
.map(targetClass::cast)
.collect(Collectors.toList());
}
uj5u.com熱心網友回復:
首先 List<?> 沒有任何型別資訊。您期望 SomeObject 的串列,但您的方法只回傳任何型別的串列。
為了實作您的目標,您應該將您的過濾器方法定義為
private static <T extends SomeInterface> List<T> filterGenericList(List<T> objects, String flag)
通過這種方式,您可以保證回傳的串列與輸入串列的型別相同
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474110.html
上一篇:如何在java中將字串轉換為泛型
