Java:声明具有多个通用“约束”的变量

时间:2011-02-01 09:58:41

标签: java generics

我在java中有一堆类,它们都实现了一个名为IdObject的接口(指定了一个getId()方法)。而且,他们也都实现了Comparable<>将自己作为类型参数,因此它们都可以与自己相媲美。

我想要做的是声明这些对象的列表,填充它,然后对它进行排序并在它们上调用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()。

第一行不编译。

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

问候

3 个答案:

答案 0 :(得分:12)

List<? extends IdObject & Comparable<?>>

这种类型的multiple bounded type parameters只能在班级签名中使用,我担心。

所以我猜你最接近的是定义一个接口:

public interface MyInterface extends IdObject, Comparable<MyInterface>

宣布你的名单如下:

List<? extends MyInterface> objectList = null;

答案 1 :(得分:0)

如何创建另一种类型;

public CompIdObject extends IdObject implements Comparable {
...
}

并将此类型用于您的泛型?

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

答案 2 :(得分:0)

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

前进的方法是设计一个扩展IdObject和Comparable的接口,然后在通用列表定义中使用它。