我知道在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);
}
}
静态函数无法访问类类型参数T和U,因此它定义了新的独立参数。现在Test<E,V>
,返回类型是E确实实现Comparable的地方,而V就像您的U参数一样是无界的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句