(如何?)我可以使用多个正交接口参数化Java类吗?

时间:2013-05-15 15:43:55

标签: java generics parameterization

是否可以在Java中为泛型类型指定多个接口?

具体来说,我正在使用现有的库(NASA World Wind),它的对象有许多接口。我有一组我正在使用的异构对象,我想存储在列表中。所有对象都实现了多个接口,每个接口对我都很有用(特别是自描述的Movable和Renderable)。

我是否缺少某些语法来执行此操作或不允许这样做?我必须选择一个并投射给其他人吗?

3 个答案:

答案 0 :(得分:3)

如果可能,请定义所有其他扩展的公共超接口。然后,该列表将被声明为包含该类型的对象。

另一种选择是在类声明级别指定多个上限是可能的,并相应地声明list属性:

public class Foo<T extends Interface1 & Interface2> {
    private List<T> theList;
}

只要类型T实现两个接口,上述工作就会起作用。

答案 1 :(得分:2)

看看Angelika Langer的常见问题:What is the difference between a wildcard bound and a type parameter bound?

她举了一个例子:

class Box< T extends Comparable<T> & Cloneable >  
    implements Comparable<Box<T>>, Cloneable {...}

此处,T extends Comparable<T> & Cloneable是绑定的类型参数,并声明T具有可比性且可克隆。一般形式是:

TypeParameter extends Class & Interface1 & ... & InterfaceN

编译后,当类型被删除时,类型参数将转换为第一种类型。上面的T会被删除为Comparable<T>

所以,假设你写道:

public class HurricanePattern<T extends Movable & Renderable> {
    private T eye;
    // ...
}

在类型擦除之后,eye的运行时类型为Movable

答案 2 :(得分:0)

您可以创建自己的接口,作为包装器,扩展多个接口:

public MyInterface extends Comparable,Serializable,... {};
public class Foo<T extends MyInterface> {...}