簡體   English   中英

Java泛型未選中擴展類的警告

[英]Java generics unchecked warnings for extended classes

我有以下代碼:

public class Foo {

    interface Coo<T> {
        public T cool();
    }

    abstract class Bar<T extends Bar<T>> implements Coo<T>  {

        @SuppressWarnings("unchecked")
        T doSomething() {
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @Override
        public T cool() {
            return (T) this;
        }

    }

    class FooBar extends Bar<FooBar> {
        @Override
        public FooBar cool() {
            return super.cool();
        }

    }
}

為什么轉換為(this)對象類型不安全? 當Bar實現Coo時,返回cool的通用說法不一定是T類型,它擴展了Bar或它的子類?

因為thisBar已鍵入Bar<T extends Bar<T>>但不T ,編譯器生成的警告Bar#doSomething 以下內容不會產生任何警告:

abstract class Bar<T extends Bar<T>> {

    Bar<T> doSomething() {
        return this;
    }

}

Bar#cool的主體期望thisT的子類型,但事實並非如此。 Bar#coolthis有類型Bar<T extends Bar<T>>並且是Coo<T>的子類型但不是T

T延伸Bar<T>Bar<T>類型this )不延伸T

想像

class A extends Bar<A> { ... }
class B extends Bar<A> { ... }

然后該方法繼承為:

class B {
    A doSomething() {
        return (A) this;
    }
}

這顯然是不對的。

用泛型做你想做的事是不可能的。 這是人們的一個很大的誤解。 他們認為遞歸邊界將允許你做自我類型。 但是遞歸邊界在Java中幾乎沒有用。 99%的地方你看到人們編寫interface Bar<T extends Bar<T>> ,把它寫成interface Bar<T>就好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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