Java Generics Unchecked Cast警告:抽象类A <t extends =“”a =“”>

时间:2015-09-03 17:34:09

标签: java generics

另一个Java Generics未经检查的演员提问:

我们有以下内容:

public abstract class A<T extends A> {

    public final T doSomething() {
        return (T)this; //unchecked cast A<T> to T
    }
}

那么,这种不受限制的演员是否会让我们感到压抑,或者确实存在失败的情况?

2 个答案:

答案 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。

相关问题