我有一個類的繼承關系,定義如下:
我有一個類的繼承關系,定義如下:
我有一個類的繼承關系。
class ClassA{}。
class ClassB extends ClassA{}。
class BaseClass{}。
{
public <T extends ClassA> T method1(){ return null; }
public <T extends ClassA> T method2(T param1){ return null; }
我想擴展上面的BaseClass,并覆寫method1和method2的實作,但我在DerivedClass中的方法簽名方面很糾結。下面是我的嘗試:
class DerivedClass extends BaseClass
{
public ClassB method1() {return new ClassB()。 }
publicClassB method2(ClassB param1) {return new ClassB()。 }
對于method1,我得到的警告是:
型別安全。return型別ClassB for method1()從DerivedClass型別中需要未經檢查的轉換以符合BaseClass型別的T
對于method2,我得到以下錯誤:
DerivedClass型別的方法method2(ClassB)必須覆寫或實作一個超型別方法
我如何解決這個問題呢?
編輯:我不得不重構設計,把通用型別放在BaseClass上,而不是每個單獨的方法上,這樣就不會出現這種情況了。
uj5u.com熱心網友回復:
這個方法會起作用。
public class BaseClass< T extends ClassA> {
public T method1() {
return null;
}
public T method2(T param1) {
return null。
}
public class DerivedClass extends BaseClass< ClassB> {
@Override
public ClassB method1() {
return new ClassB()。
}
@Override
public ClassB method2(ClassB param1) {
return new ClassB()。
}
uj5u.com熱心網友回復:
第一個警告是因為JVM,由于型別清除不能知道ClassB是否正確(它是否擴展了ClassA),并且因為有可能會拋出一些例外,所以警告你。為了解決這個問題,你可以在該方法上添加SuppressWarnings注解
@Override。
@SuppressWarnings("unchecked")
public ClassB method1() {return new ClassB()。
第二件事非常相似,但現在JVM無法創建適當的型別/方法簽名(請注意,回傳型別不包括在Java的簽名中!)。也請注意,public ClassA method2(ClassA param1)方法不會導致這樣的錯誤)。
為了解決這個問題,你需要讓編譯器確定被覆寫的方法會有正確的簽名,為了做到這一點,你需要將通用型別宣告移到類的層面上
class BaseClass <T extends ClassA>
然后用適當的型別擴展這個類
class DerivedClass extendsBaseClass< ClassB> {
public ClassB method1() { //注意,你不再需要Suppress注釋了。
return new ClassB()。
}
public ClassB method2(ClassB param1) {
return new ClassB()。
}
現在編譯器能夠檢查所使用的型別是否處于系結狀態
class ClassC {}。
class DerivedClass extends BaseClass< ClassC> {
// ERROR: Type parameter 'com.mantkowicz.example.ClassC' is not within its bound.
在此閱讀更多內容:
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318647.html
標籤:
