我遇到過不清楚如何編譯代碼的情況,雖然可以通過在每個子類中創建一個新方法而不是超類中的一個方法來輕鬆解決該問題(但看起來很醜!)我「已經簡化了我的代碼,讓我先從一個類的鏈(我宣佈他們的靜態只是爲了方便):Java嵌套的泛型:應該是什麼形式的參數類型?
interface U0 { }
static class U1 implements U0 {
public int x = 1;
}
static class U2 extends U1 { }
然後,有一個抽象類,做了一些容器:
static abstract class M<U extends U0, C extends List<? extends U>> {
C field;
public abstract boolean check(C c);
}
以及作用於U1或U1的任何後代(例如U2)的派生類的示例:
static class M1 extends M<U1, List<? extends U1>> {
@Override
public boolean check(List<? extends U1> c) {
return !c.isEmpty() && c.get(0).x > 0;
}
}
現在,讓我們說,我要延長容器中,先加入一個通用類:
static class MyList<U extends U0> extends ArrayList<U> {
...
}
和所謂的 「檢查」 M的方法派生類中:
static class MyList1 extends MyList<U2> {
void test() {
M1 m1 = new M1();
m1.check(this);
}
}
所有這些工作到目前爲止,但現在我希望取代線
M1 m1 = new M1();
m1.check(this);
用單個電話
callCheck(new M1());
某些在MyList中聲明的方法。因此,MyList類現在更改爲
static class MyList<U extends U0> extends ArrayList<U> {
void callCheck(??? m) {
m.check(this);
}
}
參數m應該是什麼類型?
還要注意,可以用,比如說M的其他後代,C = MyList1或列表的一些其他的擴展,而且還callCheck應與這些後代只要工作,以及(如代碼
SomeM someM = new SomeM();
someM.check(this);
作品,其中SomeM延伸M < ...>)
此代碼編譯使用Java 1.8.0_77和設置parmaeter鍵入到M – ghg565
是的,但是接下來有兩個警告:原始類型和類型安全......沒有它可能嗎?否則,使用泛型沒有多大意義...... –