Java Generics Unchecked Cast警告:抽象类A <T扩展A>

nms*_*nms 0 java generics

另一个Java Generics未经检查的演员问题即将出现:

我们有以下内容:

public abstract class A<T extends A> {

    public final T doSomething() {
        return (T)this; //unchecked cast A<T> to T
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,这种不受限制的演员是我们可以抑制的东西还是真的存在这种情况会失败?

Joh*_*ger 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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,@ awksp建议更改为...

abstract class A<T extends A<T>> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

......没有拯救这个例子.随着这种变化,类型安全诊断A.doSomething()仍然是唯一的,当然AnotherClass.someMethod()仍然抛出ClassCastException.