如何实现只接受 Comparable Objects 的列表 Class
How to implement a List Class that only accepts Comparable Objects
我正在实现一个通用 ArrayList class,它将遵循给定元素的自然顺序。我假设有一些方法可以做到这一点,类似于 TreeSet 如何遵循给定元素的自然顺序。
当我对存储在其中的 objects 使用 .compareTo 方法调用时,出现错误“无法解析 'E' 中的方法 'compareTo'”。我如何告诉编译器 Object E 应该只是实现了可比接口的 classes?
现在,相关代码如下所示:
public class SortedList<E> {
...
public int indexOf(E value) {
...
else if (value.compareTo(this.get(minIndex)) > 1)...
}
}
这 post 几乎可以提供帮助:
但它针对一种特定的静态方法,而我需要整个 class 的 objects 具有可比性,并且相同的添加似乎不适用于 class header .
有什么我可以添加到执行类似功能的 class header 的吗?
您必须强制要求您的类型参数与其自身具有可比性(因此它具有自然顺序)。您可以通过 bounding the parameter.
public class SortedList<E extends Comparable<E>> {
这样指定。此 bounded
类型允许比较 E
和 subtypes of E
。
public class SortedList<E extends Comparable<? super E>> {
public int indexOf(E value) {
...
else if (value.compareTo(this.get(minIndex)) > 1)...
}
}
Java中的多重继承非常简陋,但确实存在:一个class可以实现多个接口。因此一个集合可以这样声明
ArrayList<Comparable<?>> list = new ArrayList<>();
然后您只能添加各种 class 实现 Comparable 的对象,而不必担心类型层次结构。
然而,以这种方式实现 Comparable 确实意味着存在一种方法 int compareTo(Object other)
,该方法的内部实现通常包括类型转换,并且不会接受任意输入。
现代 Java 建议改用 Comparable<ToSomething>
,将您的可比对象限制在较窄的类别中。这个ToSomething
也不一定是你的class的名字,可以是另外一个marker接口
我正在实现一个通用 ArrayList class,它将遵循给定元素的自然顺序。我假设有一些方法可以做到这一点,类似于 TreeSet 如何遵循给定元素的自然顺序。
当我对存储在其中的 objects 使用 .compareTo 方法调用时,出现错误“无法解析 'E' 中的方法 'compareTo'”。我如何告诉编译器 Object E 应该只是实现了可比接口的 classes?
现在,相关代码如下所示:
public class SortedList<E> {
...
public int indexOf(E value) {
...
else if (value.compareTo(this.get(minIndex)) > 1)...
}
}
这 post 几乎可以提供帮助:
有什么我可以添加到执行类似功能的 class header 的吗?
您必须强制要求您的类型参数与其自身具有可比性(因此它具有自然顺序)。您可以通过 bounding the parameter.
public class SortedList<E extends Comparable<E>> {
这样指定。此 bounded
类型允许比较 E
和 subtypes of E
。
public class SortedList<E extends Comparable<? super E>> {
public int indexOf(E value) {
...
else if (value.compareTo(this.get(minIndex)) > 1)...
}
}
Java中的多重继承非常简陋,但确实存在:一个class可以实现多个接口。因此一个集合可以这样声明
ArrayList<Comparable<?>> list = new ArrayList<>();
然后您只能添加各种 class 实现 Comparable 的对象,而不必担心类型层次结构。
然而,以这种方式实现 Comparable 确实意味着存在一种方法 int compareTo(Object other)
,该方法的内部实现通常包括类型转换,并且不会接受任意输入。
现代 Java 建议改用 Comparable<ToSomething>
,将您的可比对象限制在较窄的类别中。这个ToSomething
也不一定是你的class的名字,可以是另外一个marker接口