2011-02-01 97 views
9

我有一堆java中的所有类实现了一个名为IdObject的接口(指定一个getId()方法)。而且,它们全都实现了可比较的类型参数,所以它们都可以与它们自己相媲美。Java:声明变量具有多个通用的“约束”

我想要做的是声明这些对象的列表,填充它,然后对它们进行排序并对它们调用getId()。所以,我的代码如下所示:

List<? extends IdObject & Comparable<?>> objectList = null; 

if (foo) { 
    objectList = new ArrayList<TypeA>(); 
    ... 
} else if (bar) { 
    objectList = new ArrayList<TypeB>(); 
    ... 
} 

if (objectList != null) { 
    Collections.sort(objectList); 
    for (IdObject o : objectList) { 
     System.out.println(o.getId()); 
    } 
} 

基本上我的问题就出在第一线 - 我想指定两个“限制”的类型,因为我需要的第一个,以确保我可以打印ID中循环和第二个,以确保我可以在列表上使用Collections.sort()。

第一行不编译。

有没有办法使这项工作没有指定没有类型参数和使用未经检查的操作的泛型?我在互联网上也找不到这样的例子。

问候

回答

0

如何创建antoher类型;

public CompIdObject extends IdObject implements Comparable { 
... 
} 

并使用此类型为您的仿制药?

List<? extends CompIdObject<?>> objectList = null; 
+2

警告:您的CompIdObject未声明为通用。 – Nicolas 2011-02-01 10:12:44

11
List<? extends IdObject & Comparable<?>> 

这种类型的multiple bounded type parameters只能在课堂上签名,我很害怕。

所以我想你可以得到的最接近的是定义一个接口:

public interface MyInterface extends IdObject, Comparable<MyInterface> 

,并声明您的列表如下:

List<? extends MyInterface> objectList = null; 
+1

比`MyInterface`更好地说'ComparableIdObject`。 – Raedwald 2011-02-01 13:09:21

0

我想之前做类似的事情上的字段但它不能完成(或许有人可以详细说明这是技术限制还是设计选择,我不确定)。

未来的方向是设计一个inter面对扩展IdObject和Comparable,然后在通用列表定义中使用它。