是否可以在 Java 中为泛型类型指定多个接口?
具体来说,我正在使用一个现有的库(NASA World Wind),它有许多对象接口。我有一组正在使用的异构对象,我想将它们存储在一个列表中。所有的对象都实现了多个接口,每个接口都对我有用(特别是自描述的 Movable 和 Renderable)。
我是否缺少一些语法来执行此操作或不允许这样做?我必须选择一个并投给其他人吗?
是否可以在 Java 中为泛型类型指定多个接口?
具体来说,我正在使用一个现有的库(NASA World Wind),它有许多对象接口。我有一组正在使用的异构对象,我想将它们存储在一个列表中。所有的对象都实现了多个接口,每个接口都对我有用(特别是自描述的 Movable 和 Renderable)。
我是否缺少一些语法来执行此操作或不允许这样做?我必须选择一个并投给其他人吗?
如果可能,定义一个通用的超接口,所有其他接口都从该接口扩展。然后,列表将被声明为包含该类型的对象。
另一种选择是在类声明级别指定多个上限是可能的,并相应地声明列表属性:
public class Foo<T extends Interface1 & Interface2> {
private List<T> theList;
}
只要类型T
实现了这两个接口,上述方法就可以工作。
查看 Angelika Langer 的常见问题解答:通配符绑定和类型参数绑定有什么区别?.
她举了一个例子:
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
.
您可以创建自己的接口,作为包装器,它扩展了几个接口:
public MyInterface extends Comparable,Serializable,... {};
public class Foo<T extends MyInterface> {...}