這似乎是一個編譯器問題,或者可能是由於設計而存在的。使用更多的泛型擴展類時,Java類信息會丟失
ClassA
是一個有兩種泛型的類。 ClassB
將通過提供一種固體泛型來擴展ClassA
,但仍然暴露另一種。
在下面的例子中,將傳入E
的類型將擴展ClassA
,所以當調用任何方法時,如果需要,返回類型仍然是可以調用子類型方法的子類型。這背後的動機是做一個建設者模式,例如,
ClassB b = new ClassB<String>().m1().m2().m3().m4()......
public class ClassA<E, T> {
public final E e;
public final T t;
public ClassA(T t) {
this.e = (E)this;
this.t = t;
}
public E printA() {
System.out.println("AAAAAA");
return e;
}
}
public class ClassB<T> extends ClassA<ClassB, T> {
public ClassB(T t) {
super(t);
}
public ClassB printB() {
System.out.println("BBBBBB");
return this;
}
public static void main(String[] args) {
ClassB<String> classB = new ClassB<>("Hello World");
// classB.printA().printA().printA(); // This will fail, after the second printA() return Object type instance instead of ClassB.
System.out.println(classB.printA().printA().getClass()); // This will print "class ClassB", so the class information it still there.
((ClassB)classB.printA().printA()).printA(); // Casting the instance to ClassB again will make it work again.
}
}
的問題是,當你調用該方法兩次,返回實例類型會丟失,所以這將是一個Object
類型,而不能調用任何ClassA/B
方法沒有鑄造它。這太奇怪了。
有什麼想法?
'class ClassB extends ClassA ,T>' –
Zefick
*「這似乎是一個編譯器問題」*。這是不可能的。你應該認爲問題在你身邊。 –
@zefick謝謝。 –