如何在Java中设置泛型类型的约束?

时间:2010-01-17 16:27:51

标签: java generics constraints

我有一个通用类:

public class ListObject<T>
{
    // fields
    protected T _Value = null;
      // ..
}

现在我想做以下事情:

ListObject<MyClass> foo = new ListObject<MyClass>();
ListObject<MyClass> foo2 = new ListObject<MyClass>();
foo.compareTo(foo2);

问题:

如何定义compareTo()方法并解析通用T

我想我必须以某种方式在通用T上实现约束,以告诉T实现特定的接口(如果存在的话,可能是Comparable)。

任何人都可以向我提供一个小代码示例吗?

4 个答案:

答案 0 :(得分:46)

另请阅读此处的讨论:Generics and sorting in Java

简短的回答,你能得到的最好的是:

class ListObject<T extends Comparable<? super T>> {
    ...
}

但也有理由只使用:

class ListObject<T extends Comparable> {
    ...
}

答案 1 :(得分:5)

这取决于你想要compareTo方法做什么。只需定义compareTo方法以获取其他ListObject<T>值,即可通过以下方法完成

public class ListObject<T> {
  public int compareTo(ListObject<T> other) {
    ...
  }
}

但是,如果您想在该参数上实际调用方法,则需要添加一些约束以提供有关T值的更多信息,如此

class ListObject<T extends Comparable<T>> {
  ...
}

答案 2 :(得分:2)

试试public class ListObject<T extends U>。只有实现T(或从U派生)的U才会被允许替换。

答案 3 :(得分:-3)

public class ListObject<T implements Comparable> {...}