构造函数中的其他类型界限



说我有这样的课:

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());
}

最新更新