簡體   English   中英

Java Generics Unchecked Cast警告:抽象類A <T extends A>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM