如何使对象具有可比性

时间:2011-04-01 17:01:52

标签: java generics

我有类,包含不同类型和实现Iterable<Object>接口。但对我来说非常重要,我可以比较元素。我知道,我不能写出像Iterable<Object & Comparable<?>>那样的东西,所以我该怎么办?

我确保,课程中包含的每一个元素都是:

  • 不能null
  • 可与同类型元素相媲美。
  • 是不可变的。好吧,至少是我要检查的部分。

不是这样,我只是想比较元素,因为我可以这样做:

private static int hackCMP(Object val, Object val2)
        throws SecurityException, NoSuchMethodException,
        IllegalArgumentException, IllegalAccessException,
        InvocationTargetException {
    Method m = val.getClass().getMethod("compareTo", val.getClass());
    return (Integer) m.invoke(val, val2);
}

我想将元素作为输入传递给另一个类间接构造函数,这也确保元素需要具有可比性。这种方法是:

public static <T extends Comparable<?>> Os of(final Iterator<T> values) {

3 个答案:

答案 0 :(得分:2)

Dave Costa指出,你应该真正使用Iterator<Comparable<?>>而不是Object。您的类型应根据需要具体说明。如果您有方法Comparable<?>,那么请使用它。接受对象的方法可以采取任何方式,包括Comparable 秒。

答案 1 :(得分:1)

你可以写

public static <T extends Object & Comparable<?>> Os of(final Iterator<T> values) {

这是你的问题吗?

编辑:如果你想假设对象具有可比性,你可以这样做。

public static int compare(Object o1, Object o2) {
    return ((Comparable) o1).compareTo((Compareable) o2);
}

答案 2 :(得分:0)

最好用的是<T extends Comparable<? super T>>

你需要拥有第二个T,因为当你拥有T extends Comparable<?>时,实际上并不能确保该类型与自身相当。您可能认为这很愚蠢,但我完全可以创建一个类Foo implements Comparable<String>,因此Foo个对象无法与它们进行比较。如果没有第二个T,您将无法保证对象与自身进行比较,并且必须使用原始类型或不安全的东西来传递它。

? super更加微妙。在考虑Comparable类的子类时需要它。例如,如果A implements Comparable<A>B extends A,则自动B implements Comparable<A>B不能implement Comparable<B>,因为它只能实现一次接口)。因此,为了让B能够使用您的设计,Comparable的参数应为? super T,而不仅仅是T,以使其成为T的超类