[英]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或它的子類?
因為this
在Bar
已鍵入Bar<T extends Bar<T>>
但不T
,編譯器生成的警告Bar#doSomething
。 以下內容不會產生任何警告:
abstract class Bar<T extends Bar<T>> {
Bar<T> doSomething() {
return this;
}
}
Bar#cool
的主體期望this
是T
的子類型,但事實並非如此。 在Bar#cool
, this
有類型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.