2017-08-12 32 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();太普通阵列!