就是这种情况,我有两个类A
,B
和一个通用接口C
Class A implements Comparable<A> {...}
interface C<T> {...}
//this class is not longer generic type, I do not know if this matter.
Class B extends A implements C<A> {...}
然后,在其他课程中,我得到了一个B
列表,并将其排序为
List<B> list = new ArrayList<B>();
Collections.sort(list);
这很有效,但现在我想将B
的列表更改为通用接口C
,以便它更通用。
List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list);
这次我得到的错误如下:
绑定不匹配:类型
sort(List<T>)
的通用方法Collections
不是 适用于参数(List<C<A>>)
。推断类型C<A>
不是 有效替代有界参数<T extends Comparable<? super T>>
我尝试了以下修改(当然不起作用):
C
更改为interface C<T> extends Comparable<T>{...}
B
更改为class B extends A implements C<A>, Comparable<T> {...}
有人能帮助我吗?
答案 0 :(得分:2)
将C更改为接口C扩展Comparable {...} B类扩展A实现C {...}
正如您从错误消息中已经看到的那样,这两个不会一起工作,因为B
的定义与Comparable<A>
和Comparable<C<A>>
之间存在冲突。
由于A
已在实施Comparable<A>
,您可以实现以下
List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list);
为Comparator
定义C<A>
,如下所示:
class CTComparator<T> implements Comparator<C<T>>
{
@Override
public int compare(C<T> o1, C<T> o2)
{
return 0;
}
}
然后使用此比较器应用sort方法:
List<C<T>> list = new ArrayList<C<T>>();
Collections.sort(list, comparator);
答案 1 :(得分:1)
由于C<A>
没有Comparator
中定义的A
的可见性,因此它正在抱怨。定义一个新的C<A>
比较器,它应该没问题。
List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list, new Comparator<C<A>>() {
@Override
public int compare(C<A> o1, C<A> o2) {
//implement the comarison
return 0;
}
});
答案 2 :(得分:1)
如果您希望C<T>
根据其包含的类型进行一般性比较,则应使其自身(C<T>
,而不是T
)具有可比性,但将其值类型绑定到那些实施Comparable
的人。像这样:
public class C<T extends Comparable<? super T>> extends Comparable<C<T>> {
private final T value;
@Override
public int compareTo(C<T> that) {
return this.value.compareTo(that.value);
}
}
这仅适用于某些容器,例如那些只包装值的容器。