作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是一个编译器问题,或者这可能是设计使然。
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/
我是一名优秀的程序员,十分优秀!