当第一个绑定是类型参数时,是否有另一种方法来指定附加边界?

时间:2015-12-29 10:42:37

标签: java typing

我知道在Java中不可能在第一个绑定是类型参数时指定附加绑定;但是,我想知道是否有人知道另一种方法来做类似的事情并在编译时保持安全吗?我在下面提供了一个例子。

在下面的代码中,我指的是:<E extends T & Comparable<T>>。在这种情况下,如果T的类型可比较,我希望能够使用内置比较器,否则,我想指定我自己的比较器。

在编译时保持类型安全性是否还有其他方法可以做到这一点?

public class ExampleClass<T, U> {
  [...]

  public <E extends T & Comparable<T>> ExampleClass(Function<U, E> function) {
    this.function = function; 
    this.comparator = (E a, E b) -> a.compareTo(b);
  }

  public ExampleClass(Function<U, T> function, Comparator<U> comparator) {
    this.function = function;
    this.comparator = comparator;
  }

}

1 个答案:

答案 0 :(得分:3)

您可以通过将第一个构造函数实现为委托给第二个构造函数的静态方法来解决您的问题,如下所示:

import java.util.Comparator;
import java.util.function.Function;

public class Test<T,U> {
  private final Function<U,T> function;
  private final Comparator<T> comparator;

  public Test(Function<U,T> function, Comparator<T> comparator) {
    this.function = function;
    this.comparator = comparator;
  }

  public static <E extends Comparable<E>, V> Test<E,V> withNatOrder(Function<V,E> function) {
      // Any of these two will do
      final Comparator<E> comp = (E a, E b) -> a.compareTo(b);
      final Comparator<E> comp2 = Comparator.naturalOrder();
      return new Test<>(function, comp);
  }
}

静态函数无法访问类类型参数T和U,因此它定义了新的独立参数。返回类型现在为Test<E,V>,其中E确实实现了Comparable,V与U参数无关。