我已經閱讀了一些關于泛型的主題,但是在本文的最后一段通配符使用指南中,這句話“您可以捕獲通配符并撰寫您從串列中讀取的元素”真的讓我感到困惑。
我已經在idea中對其進行了測驗,這是代碼:
class NaturalNumber {
private int i;
public NaturalNumber(int i) { this.i = i; }
// ...
}
class EvenNumber extends NaturalNumber {
public EvenNumber(int i) { super(i); }
// ...
}
// test method, ignore class
@Test
public void redisTest() {
List<EvenNumber> evenNumbers = new ArrayList<>();
evenNumbers.add(new EvenNumber(1));
List<? extends NaturalNumber> naturalNumbers = evenNumbers;
// idea compiler error, Required type:
//capture of ? extends NaturalNumber, Provided:
//capture of ? extends NaturalNumber
naturalNumbers.add(naturalNumbers.get(0));
}
為什么“naturalNumbers.add(naturalNumbers.get(0))”不起作用,以及如何實作“您可以捕獲通配符并寫入您從串列中讀取的元素”
uj5u.com熱心網友回復:
為什么“naturalNumbers.add(naturalNumbers.get(0))”不起作用
因為您正試圖寫入一個未知子型別的串列NaturalNumber。List<? extends NaturalNumber>表示一個串列NaturalNumber或其子型別,例如EvenNumber和OddNumber。編譯器不知道實際型別。
我如何實作“您可以捕獲通配符并寫入您從串列中讀取的元素”
你可以像這樣實作它:
private <T> void addNaturalNumber(List<T> naturalNumbers) {
naturalNumbers.add(naturalNumbers.get(0));
}
這里我們說型別變數T已經捕獲了通配符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311150.html
上一篇:方法論據
