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

cit*_*nas 39 java generics constraints

我有一个通用类:

public class ListObject<T>
{
    // fields
    protected T _Value = null;
      // ..
}
Run Code Online (Sandbox Code Playgroud)

现在我想做类似以下的事情:

ListObject<MyClass> foo = new ListObject<MyClass>();
ListObject<MyClass> foo2 = new ListObject<MyClass>();
foo.compareTo(foo2);
Run Code Online (Sandbox Code Playgroud)

题:

如何定义compareTo()具有泛型的方法T

我想我必须以某种方式对泛型实现一个约束T,告诉它T实现一个特定的接口(也许Comparable,如果那个存在).

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

nan*_*nda 49

另请阅读此处的讨论:Java中的泛型和排序

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

class ListObject<T extends Comparable<? super T>> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但也有理由只使用:

class ListObject<T extends Comparable> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 另请查看相关主题:http://stackoverflow.com/questions/2064169/what-does-this-class-declaration-mean-in-java/2072820,其中讨论了表单通配符的需求:<?超级T> (3认同)

Jar*_*Par 5

这取决于您希望compareTo方法做什么.只需定义compareTo方法以获取其他ListObject<T>值,即可完成以下操作

public class ListObject<T> {
  public int compareTo(ListObject<T> other) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

class ListObject<T extends Comparable<T>> {
  ...
}
Run Code Online (Sandbox Code Playgroud)