考慮使用非靜態內部類的以下泛型類Base<ID>
。爲什麼Eclipse Java編譯器會抱怨內部派生類型未經檢查強制轉換?
public class Base<ID> {
ID id;
public Base(ID id) {
this.id = id;
}
public ID getId() {
return id;
}
protected class BaseInner {
String text = "Inner";
}
protected void method(BaseInner o) {
o.text = "Foo";
}
}
Base.method
需要BaseInner
類型的參數的方法。現在考慮下面的派生類。
public class Sub<ID> extends Base<ID> {
public Sub(ID id) {
super(id);
}
@Override
protected void method(BaseInner o) {
if (o instanceof Sub.SubInner) {
SubInner sub = (SubInner) o; // Why does this cast emit an "unchecked cast" warning
sub.text = "Bar";
sub.value = 1337;
}
}
protected class SubInner extends BaseInner {
Number value = 42;
}
}
類Sub
從Base
派生和內部類SubInner
從內類BaseInner
派生。 Sub
的泛型類型參數ID
作爲類型參數傳遞給基類Base
。
我的問題:爲什麼編譯器抱怨從BaseInner
投給SubInner
在Sub
首要method
?
爲了理解這個警告,我嘗試構造一個用例,其中調用Sub<A>
的method
的某些Sub<B>.SubInner
證明警告正確。但是任何我能想到的(包括? extends
和? super
)都會在方法調用時發出編譯器錯誤,如果這些類型不兼容的話。
所以我想沒有理由在method
的未經檢查的演員的警告。我錯過了什麼?
由於方法覆蓋發生在Sub<ID>
實現中,編譯器能夠將SubInner
的通用類型減去Sub<ID>.SubInner
。所以這個問題是不是重複!
Eclipse編譯器警告
類型安全:未選中從基礎施法< ID> .BaseInner到子< ID> .SubInner
華林不會改變既不如果我使用Base<ID>.BaseInner
作爲方法參數,如果我在演員表達中使用Sub<ID>.SubInner
。
只是一個猜測,但既然你在if語句中使用'instanceof Sub.SubInner',你不應該在下面的語句中使用'Sub.SubInner'嗎? – nbro
我已經試過了,並且在劇組中也使用了'Sub .SubInner',但它總是產生相同的警告。 –
niks
你使用什麼編譯器?我沒有得到任何與javac 8警告。 – assylias