簡體   English   中英

Java泛型和繼承

[英]Java generics and inheritance

我有以下抽象類:

public abstract class AbSuperClass1<K,S> {
    //class definition
}

和:

public abstract class AbSuperClass2<K,S> {
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg);
    ...
}

然后我有兩個具體的實現

public class Concrete1 extends AbSuperClass<String, String>{
    //class definition
}

和:

public class Concrete2 extends AbSuperClass2<String, String>{
    public void method(Concrete1 arg){
        //method definition
    }
}

但是,這不會編譯,因為Concrete1不被識別為Concrete2中方法的參數的有效類型,但據我所知,Concrete1的類型正確,因為它擴展了AbSuperClass1。

我哪里錯了?

考慮這個程序:

public class OtherConcrete extends AbSuperClass<String, String> {}

AbSuperClass2<String, String> x = new Concrete2();
x.method(new OtherConcrete());

你期望做什么? 您已經在為AbSuperClass<String, String> 一個特定子類型提供實現方面覆蓋了方法 - 但是您沒有提供可以處理任何 AbSuperClass<String, String> ,這是必需的。

在不了解情況細節的情況下,很難提出具體的行動方案。 Bozho建議添加另一個類型參數 - 允許你使method聲明更具體 - 是一個很好的...但整個過程變得非常復雜。 如果你可以通過任何方式減少通用funkiness的數量,你的代碼維護者可能會感謝你。

Eclipse建議添加此方法:

@Override
public <Q extends AbSuperClass1<String, String>> void method(Q arg) {
    // TODO Auto-generated method stub

}

您可以做的另一件事是將此類型參數添加到類中:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> {
    public abstract void method(Q arg);
}

class Concrete2 extends AbSuperClass2<String, String, Concrete1> {
    public void method(Concrete1 arg) {
        //method definition
    }
}

暫無
暫無

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

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