说我有这样的课:
class OrderedFoo<T> {
public OrderedFoo(Comparator<? super T> comparator) {
//Do something
}
}
我可以将其用于不可分配的对象,因为实现Comparable
的类型参数不需要。
我也可以将其用于可比较的对象,使用Comparator#naturalOrder
。
示例:
OrderedFoo<Watchable> nonComparable = new OrderedFoo<>((a, b) -> foo());
OrderedFoo<String> comparable = new OrderedFoo<>(Comparator.naturalOrder());
但是,必须为可比较类型指定默认比较器有些乏味。是否可以编写具有类型参数的构造函数?
//Like this
public <???> OrderedFoo() {
this(Comparator.naturalOrder());
}
我尝试了<T extends Comparable<? super T>>
,但我得到了
(java.util.Comparator<? super T>)
in OrderedFoo cannot be applied to
(java.util.Comparator<T>)
这是可以使用构造函数的?
您不能直接使用构造函数执行此操作,因为该构造函数必须适用于所有类型;但是您只想适用于Comparable
类型。
使用具有适当约束类型变量的静态工厂方法:
public static <T extends Comparable<T>> OrderedFoo<T> naturalOrder() {
return new OrderedFoo<>(Comparator.naturalOrdering());
}