我經歷了很多與此相關的問題,但我無法解決我的問題。
這是我的問題。
我有一個父抽象類。
public abstract class Parent{ }
我還有另外兩個從上述父類擴展的子類。
public class ChildOne extends Parent{}
public class ChildTwo extends Parent{}
在另一個類中,我正在使用這三個類,如下所示。
public class A{
public List<ExcelRecord<Parent>> getExcelRecords() {
ChildOne childone = new ChildOne();
List<ExcelRecord<ChildOne>> list = new ArrayList<>();
// some logic here
return list; // **compilation here**
}
}
該代碼產生以下編譯錯誤:
required: List<ExcelRecord<Parent>>
provided: List<ExcelRecord<ChildOne>>
我需要將子型別泛型回傳到父型別泛型。我怎樣才能做到這一點?
請注意,此方法的回傳值在無法相應更改的遺留代碼中使用。它應該保留List<ExcelRecord<Parent>>。
uj5u.com熱心網友回復:
在回傳型別中使用通配符。此通配符將接受任何擴展父類的類
public List<ExcelRecord<? extends Parent>> getExcelRecords() {
//...
}
請隨時查看Java 泛型常見問題以了解更多詳細資訊
uj5u.com熱心網友回復:
除了使用上限通配符之外,? extends還有一種方法可以保持方法的回傳型別不變List<ExcelRecord<Parent>>。
正如您在問題中指定的那樣,這是一項強制性要求。
此方法的回傳值將在不能相應更改的舊方法中使用。
它將如何運作?
假設我們有以下假人ExcelRecord
public class ExcelRecord<T> {
private T item;
public ExcelRecord(T item) {
this.item = item;
}
}
如果串列是這樣宣告的:
List<ExcelRecord<Parent>> records = new ArrayList<>();
我們將能夠只添加型別的物件ExcelRecord<Parent>(或ExcelRecord具有泛型型別Parent的子型別,比如說SubExcelRecord<Parent>)。
但請注意,ExcelRecord<Parent>它本身可以具有item型別為 parentParent或其子型別的屬性,即我們可以存盤ChildOne或存盤ChildTwo在其中。并且代碼可以編譯并且作業得很好。
這是一個完整的例子:
public List<ExcelRecord<Parent>> getExcelRecords(){
List<ExcelRecord<Parent>> records = new ArrayList<>();
ExcelRecord<Parent> record1 = new ExcelRecord<>(new ChildOne()); // compiles fine
records.add(record1);
records.add(new ExcelRecord<>(new ChildTwo())); // fine as well
return records;
}
離開和呼吸在線演示
由于 Java 8目標型別,以下兩行都將成功編譯。
// assignment context
ExcelRecord<Parent> record1 = new ExcelRecord<>(new ChildOne());
// method invocation context
records.add(new ExcelRecord<>(new ChildTwo()));
在這兩種情況下,new ExcelRecord<>()都是所謂的poly-expression,即它的型別取決于它出現的背景關系。在第一種情況下,編譯器將從賦值背景關系推斷型別,在第二種情況下從呼叫背景關系推斷型別。
請注意,如果您在代碼中執行類似的操作,它將無法編譯。您的記錄應該是型別Parent。
ExcelRecord<ChildOne> record1 = new ExcelRecord<>(new ChildOne());
records.add(record1); // would raise a complition error
uj5u.com熱心網友回復:
有兩種解決方法,要么從 Parent 中洗掉abstract ,要么將Parent 作為介面,我推薦第一種。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515858.html
標籤:爪哇仿制药遗产
下一篇:在C#中強制繼承屬性
