【问题标题】:Java Generics Unchecked Cast Warning: abstract class A<T extends A>Java 泛型未经检查的强制转换警告:抽象类 A<T extends A>
【发布时间】:2015-09-03 17:34:08
【问题描述】:

又一个 Java Generics unchecked cast 问题出现了:

我们有类似以下的内容:

public abstract class A<T extends A> {

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

那么,这种未经检查的演员阵容是我们可以压制的,还是真的有可能失败的情况?

【问题讨论】:

标签: java generics


【解决方案1】:

是的,它绝对会失败。示例:

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

【讨论】:

    【解决方案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&lt;T&gt; 的合法替代,因为 C 扩展 B。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多