2017-08-12 16 views
1

我半的Java有文化,在Groovy中嘗試一些。Java的基地爲模板參數

是在Groovy/Java的以下可能:

public class A { 
} 
public class B { 
} 

public class C<Ta extends A, Tb extends B> extends Ta { 
    public Ta[] bArray; 
    public Tb[] getAllBs() 
    { 
     Tb[] ret = new Tb[0]; 
     .... 
     return ret; 
    } 
} 

以上定義不顯示任何錯誤。但是,當我嘗試使用C作爲基類的另一種類型,我得到一個錯誤:

public class DummyA extends A {}; 
public class DummyB extends B {}; 

public class D extends C<DummyA, DummyB> { 
} 

上述定義顯示錯誤「類型d的層次結構是不一致的」。

如果我重新定義C作爲任何以下的,錯誤消失:

//remove the base class, Ta, from C 
public class C<Ta extends A, Tb extends B> { 
.... 
} 

(或)

//Use the class A, instead of generic type Ta, as base class 
public class C<Ta extends A, Tb extends B> extends A { 
.... 
} 

我必須打破一些Java規則,但無法確定

+0

對我來說是失敗上'鋱[] RET =新鋱[0];'具有消息'無法創建Tb'的通用陣列 – ByeBye

回答

0

由於D的超類的超類是「通用的」,所以它不可能。
不允許使用通用的超級版本!這是允許的:

public class C<B extends WhatElse> extends ArrayList<B>{ 

因爲超顯然是在包java.lang和你只給了超類「自己的」通用參數。
而java需要一個清晰的結構編譯類!例如:你應該可以覆蓋哪些方法?

0

而且有些信息這一行:Tb[] ret = new Tb[0];行不通!
您不能生成您不能使用new Tb();太普通陣列!