gpt4 book ai didi

使用更多泛型扩展类时,Java 类信息会丢失

转载 作者:行者123 更新时间:2023-11-29 06:52:05 26 4
gpt4 key购买 nike

这似乎是一个编译器问题,或者这可能是设计使然。

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 方法而不强制转换它。这太奇怪了。

有什么想法吗?

最佳答案

您的类 ClassB 是一个泛型类,但您在不提供类型参数时选择退出泛型。

而你在这里正是这样做的

public class ClassB<T> extends ClassA<ClassB, T>
^^^^^^

这里

public ClassB printB()
^^^^^^

所以只需将这些行更改为

public class ClassB<T> extends ClassA<ClassB<T>, T>
^^^

public ClassB<T> printB()
^^^

然后它会起作用。

关于使用更多泛型扩展类时,Java 类信息会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44624288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com