2013-02-26 54 views
3

在一些SuperClass我有一個抽象的通用方法的返回類型:重寫通用抽象方法的沒有類型安全警告

protected abstract <T extends Foo> T getFoo(); 

在我​​我嘗試重寫它:

@Override 
protected SubFoo getFoo() {    
    return new SubFoo(); 
} 

其中public class SubFoo extends Foo

在我的子類的getFoo我得到以下錯誤。

「類型安全:對的getFoo返回類型SubFoo()從類型子類需要選中轉換成與類型父類符合T」

我的問題是:

1)是否有任何情況哪裏不安全?

2)如果不是,編譯器不應該能夠解決這個問題嗎?什麼是阻止編譯器弄清楚SubFoo是編譯時Foo的子類?

3)有沒有辦法實現這樣的事情,但警告自由?

+1

這本質上是不安全的。如果我用另一個類型參數調用你的方法會怎麼樣? – SLaks 2013-02-26 17:57:10

+1

@你違反了里斯科換人原則......你的超類型不能被你的子類型取代 – Geek 2013-02-26 18:26:57

回答

9

是的,這是不安全和非法的。您所寫的SuperClass聲明允許調用者(而不是SuperClass子類)選擇Foo所需的子類型,因此您在​​中的實現未正確實施。

相反,你必須有TSuperClass本身就是一個泛型參數,而不僅僅是方法:SuperClass<T extends Foo>,然後SubClass extends SuperClass<SubFoo>

+1

不知道有關非法(它編譯,沒有人來繞過逮捕我:))但我現在得到這是如何不安全的。感謝您的快速回復,您的回答解決了我的問題。 – Oren 2013-02-26 18:09:29