当第一个绑定是类型参数时,是否有另一种方法来指定附加绑定?
Is there an alternate way to specify an additional bound when first bound is a type parameter?
我知道在 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;
}
}
您可以通过将第一个构造函数实现为委托给第二个构造函数的静态方法来解决您的问题,如下所示:
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);
}
}
静态函数无法访问 class 类型参数 T 和 U,因此它定义了新的独立参数。 return 类型现在是 Test<E,V>
,其中 E 确实实现了 Comparable 并且 V 像您的 U 参数一样是无界的。
我知道在 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;
}
}
您可以通过将第一个构造函数实现为委托给第二个构造函数的静态方法来解决您的问题,如下所示:
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);
}
}
静态函数无法访问 class 类型参数 T 和 U,因此它定义了新的独立参数。 return 类型现在是 Test<E,V>
,其中 E 确实实现了 Comparable 并且 V 像您的 U 参数一样是无界的。