【问题标题】:How to set constraints on generic types in Java?如何在 Java 中对泛型类型设置约束?
【发布时间】:2018-11-17 02:54:51
【问题描述】:

我有一个通用类:

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,如果该接口存在的话)。

谁能给我一个小代码示例?

【问题讨论】:

    标签: java generics constraints


    【解决方案1】:

    阅读这里的讨论:Generics and sorting in Java

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

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

    但也有理由只使用:

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

    【讨论】:

    【解决方案2】:

    这完全取决于您希望 compareTo 方法做什么。简单地定义 compareTo 方法来获取其他 ListObject&lt;T&gt; 值是通过以下方式完成的

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

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

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

    【讨论】:

      【解决方案3】:

      试试public class ListObject&lt;T extends U&gt;。只有实现 U(或派生自 U)的 Ts 才允许替换。

      【讨论】:

      • 给我一个编译器错误。即使有这么简单的 TestClass: public class ConstraintTest { } 令牌“实现”的语法错误,预期我错过了什么?
      • @citronas:实际上是extends,即使对于接口也是如此。请注意,如果您使用具有extends 属性的基类,您实际上可以将基类直接添加到泛型对象中,这是泛型扩展最大的(也是最糟糕的) 副作用.
      【解决方案4】:
      public class ListObject<T implements Comparable> {...}
      

      【讨论】:

      • -1 投反对票,因为没有类型参数的 Comparable 是一种原始类型,您不应该在 Java 1.5+ 中使用它
      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多