是否可以在Java中为泛型类型指定多个接口?
具体来说,我正在使用现有的库(NASA World Wind),它的对象有许多接口。我有一组我正在使用的异构对象,我想存储在列表中。所有对象都实现了多个接口,每个接口对我都很有用(特别是自描述的Movable和Renderable)。
我是否缺少某些语法来执行此操作或不允许这样做?我必须选择一个并投射给其他人吗?
答案 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> {...}