問題是,沒有辦法引用「這個非常類」的類型。這就是爲什麼你必須使用像abstract class Base<T extends Base<T>>
這樣的結構。但正如很多評論中提到的,沒有什麼能阻止你定義Subclass1 extends <Subclass2>
。現在只有句法方式來保證T
是「這非常類」。
但是,您可以在運行時強制執行此保證。您可以使用類似TypeTools或其他方法來提取使用的泛型類型,並確保當前實例具有此類型。這可能會導致類似:
public abstract class Base<T extends Base<T>> {
protected Base() {
final Class<?> t = (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (!t.isInstance(this)) {
throw new IllegalArgumentException();
}
}
public T getInstance() {
@SuppressWarnings("unchecked")
T thisIsT = (T) this;
return thisIsT;
}
}
這個類可以被實例化:
public class Extension1 extends Base<Extension1> {}
但是這一次沒有:
public class Extension2 extends Base<Extension1> {}
的Base
構造保證this
是T
實例因此this
到T
的演員陣容是安全的。
如果我決定這樣做,會中斷:class ChildClass2 extends ParentClass'。 現在,我不完全清楚你想達到什麼目的,或者你爲什麼想達到目標。如果你想相應地更新你的問題,我可能會提供一個答案。 –
@JoeC我有作品,但它要求我在父類中將「this」轉換爲T.它應該已經知道'this'是T的一個實例,所以我想知道是否有更優雅的解決方案那個想法不夠聰明。無論是哪一個不需要我施放,或者是一個沒有使用泛型就返回了這個子實例。 –
試試你對我建議的子類有什麼,並讓我知道它是否仍然有效。 –