另一个Java Generics未经检查的演员提问:
我们有以下内容:
public abstract class A<T extends A> {
public final T doSomething() {
return (T)this; //unchecked cast A<T> to T
}
}
那么,这种不受限制的演员是否会让我们感到压抑,或者确实存在失败的情况?
答案 0 :(得分:7)
是的,它绝对会失败。例如:
public class B extends A<B> {
// empty
}
public class C extends A<B> {
// empty
}
public class AnotherClass {
public void someMethod() {
A<B> c = new C();
B b = c.doSomething(); /* ClassCastException */
}
}
请注意@ awksp建议更改为...
abstract class A<T extends A<T>> { /* ... */ }
...没有拯救这个例子。通过此更改,A.doSomething()
中的类型安全诊断仍然是唯一的,当然AnotherClass.someMethod()
仍会引发ClassCastException
。
答案 1 :(得分:2)
是否真的存在失败的情况?
不确定。这是一个例子:
class A<T extends A<?>> {
@SuppressWarnings("unchecked")
T get() {
return (T) this;
}
}
class B<T extends A<T>> extends A<T> {
}
class C<T extends B<T>> extends A<T> {
}
现在C的方法将返回C,但C不是T extends B<T>
的合法替代,因为C 不扩展B。