是否可以为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> {...}