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



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

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

是否有一些语法我缺少这样做,或者它是不允许的?我必须选一个然后投给其他的吗?

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

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

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

只要类型T实现了两个接口,上述工作即可。

查看Angelika Langer的FAQ:通配符绑定和类型参数绑定的区别是什么?

她举了一个例子:

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

这里,T extends Comparable<T> & Cloneable是类型参数界,说明T是可比较和可克隆的。一般形式为:

TypeParameter extends Class & Interface1 & ... & InterfaceN

编译后,当类型被擦除时,type形参就变成第一个类型。上面的T被擦除为Comparable<T>

那么,假设你写:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新