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

H. *_*uft 9 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我的问题在于第一行 - 我想为类型指定两个"约束",因为我需要第一个确保我可以在循环中打印ID而第二个确保我可以使用集合.列表中的sort().

第一行不编译.

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

问候

Sea*_*oyd 12

List<? extends IdObject & Comparable<?>>
Run Code Online (Sandbox Code Playgroud)

这种类型的多个有界类型参数只能在类签名中使用,我担心.

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

public interface MyInterface extends IdObject, Comparable<MyInterface>
Run Code Online (Sandbox Code Playgroud)

并声明你的列表如下:

List<? extends MyInterface> objectList = null;
Run Code Online (Sandbox Code Playgroud)


sta*_*ker 0

创建另一种类型怎么样?

public CompIdObject extends IdObject implements Comparable {
...
}
Run Code Online (Sandbox Code Playgroud)

并将这种类型用于您的泛型?

List<? extends CompIdObject<?>> objectList = null; 
Run Code Online (Sandbox Code Playgroud)

  • 警告:您的 CompIdObject 未声明为通用对象。 (2认同)