[英]Java Generics Unchecked Cast Warning: abstract class A<T extends A>
另一個Java泛型未經檢查的強制轉換問題出現了:
我們有如下內容:
public abstract class A<T extends A> {
public final T doSomething() {
return (T)this; //unchecked cast A<T> to T
}
}
那么,這種未經檢查的演員是我們可以壓抑的東西,還是真的有可能失敗的情況?
是的,它絕對會失敗。 例:
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
。
真的有可能失敗嗎?
當然。 這是一個例子:
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.