2015-02-23 49 views
1
public class GenericTest { 

    public static void main(String[] args) { 
     Manager<SlotA> mA = new Manager<SlotA>(); 
    } 

} 

class Manager<SlotClass extends Slot> { 

} 

abstract class Slot { 
    public Slot(Manager<? extends Slot> m) { 

    } 
} 

class SlotA extends Slot { 

    public SlotA(Manager<SlotB> m) { //a constructor with Manager<SlotA> is not required! 
     super(m); 
    } 
} 

class SlotB extends Slot { 

    public SlotB(Manager<SlotA> m) { //a constructor with Manager<SlotB> is not required! 
     super(m); 
    } 

} 

上面是模擬我想要解決的問題的代碼。我的目標是強制執行Slot必須的子類具有使用相同通用類型的管理器的構造函數。也就是說,SlotC必須有一個構造函數SlotC(Manager<SlotC> m)。從上面可以看出,SlotASlotB分別不需要SlotA(Manager<SlotA>)SlotB(Manager<SlotB>)擴展通用抽象類:正確綁定

我知道摘要Slot的構造函數不符合此要求。我如何編輯上述代碼來實現這一目標?

編輯:

我知道我可以一個泛型參數T添加到Slot,使構造Slot<T>(Manager<T>)但這意味着需要SlotA<SlotA>SlotA<SlotB>是可能的。有沒有比這更好的方法?

回答

3

你已經做出Slot類通用的,用自我指涉的類型參數:

abstract class Slot<T extends Slot<T>> { 
    public Slot(Manager<T> m) { 

    } 
} 

class SlotA extends Slot<SlotA> { 

    public SlotA(Manager<SlotA> m) { //a constructor with Manager<SlotA> is not required! 
     super(m); 
    } 
} 

class SlotB extends Slot<SlotB> { 

    public SlotB(Manager<SlotB> m) { //a constructor with Manager<SlotB> is not required! 
     super(m); 
    } 
} 

現在你SlotA構造函數只能有一個Manager<SlotA>

然而,這並沒有創建一個類像限制某人:

class SlotC extends Slot<SlotA> { } 

而且也沒有辦法,你能避免這種情況。這是一個這樣的領域,Java泛型在編譯時未能應用限制。

+0

附加說明:這就是爲什麼在最常用的示例中不允許繼承的原因:枚舉 - 它總是最終的。 – tilois 2015-02-23 20:38:15

+0

偉大的答案,並感謝您的額外信息。這是解決方案。但是,這需要對'class Manager 進行更改。 '班級經理>'這是正確的解決辦法?還是會打開任何其他通用問題? – 2015-02-23 20:40:22

+1

將其更改爲'Manager >'。 – 2015-02-23 20:45:07