gpt4 book ai didi

java - T 扩展 Comparable

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:53 24 4
gpt4 key购买 nike

我有以下类(class)。

class MyClass<T>

它使用以下构造函数。

MyClass(Comparator<T> comparator, Collection<? extends T> data)

它有一个在构造函数中设置的字段,如下所示:

this.data = Collections.unmodifiableCollection(data);

在 T 实现 Comparable 的特殊情况下,我不想要求传入比较器,因为我可以只使用自然顺序。所以我想我应该能够使用这个构造函数:

public <T extends Comparable<T>> MyClass(Collection<T> data)

但显然存在类型不匹配:无法从 Collection<T> to Collection<? extends T> 转换在上面的赋值语句中。我尝试了各种方法:添加更多通用参数等等,但都没有用。我似乎无法指定一个界限说:如果你有一个实现 Comparable 的类型 T,那么做直截了当的事情。

有什么想法吗?

谢谢。

最佳答案

不幸的是,我认为这种“如果 Comparable 做这个,其他做那个”的逻辑在 Java 类型系统中是不可能的。

您可以将 Comparable 和 non-Comparable 情况拆分为单独的类,并将它们隐藏在接口(interface)后面,如下所示:

interface Interface<T> {
public void processData();
}

class MyClass<T> implements Interface<T> {
private final Collection<? extends T> data;
MyClass(Comparator<T> comparator, Collection<? extends T> data) {
this.data = data;
}
public void processData() {
// ...
}
}

class MyCompClass<T extends Comparable<T>> implements Interface<T> {
private final Collection<? extends T> data;
MyCompClass(Collection<? extends T> data) {
this.data = data;
}
public void processData() {
// ...
}
}

class Factory {
static <T extends Comparable<T>> Interface<T> create(Collection<? extends T> data) {
return new MyCompClass<T>(data);
}
static <T> Interface<T> create(Comparator<T> comparator, Collection<? extends T> data) {
return new MyClass<T>(comparator, data);
}
}

但这可能会导致大量重复代码。另一种选择是让 MyClass 在其构造函数中需要一个比较器,并在工厂中构建该比较器:

class MyClass<T> {
private final Collection<? extends T> data;
MyClass(Comparator<T> comparator, Collection<? extends T> data) {
this.data = data;
}
public void processData() {
// ...
}
}

class Factory {
static <T extends Comparable<T>> MyClass<T> create(Collection<? extends T> data) {
return new MyClass<T>(new Comparator<T>() {
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}, data);
}
static <T> MyClass<T> create(Comparator<T> comparator, Collection<? extends T> data) {
return new MyClass<T>(comparator, data);
}
}

关于java - T 扩展 Comparable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com