JAVA:可以对未知类型的对象调用compareTo()吗?

JAVA:可以对未知类型的对象调用compareTo()吗?,java,Java,我有两个非类型化对象的集合,我想比较集合中的对象,而不知道它们是什么,除了它们实现了可比较之外。我想做一些类似的事情: int compareThings(Object o1, Object o2) { if (!(o1 instanceof Comparable) || !(o2 instanceof Comparable)) { throw ... } if (o1.getClass() != o2.getClass()) { throw ...

我有两个非类型化对象的集合,我想比较集合中的对象,而不知道它们是什么,除了它们实现了可比较之外。我想做一些类似的事情:

int compareThings(Object o1, Object o2) {
   if (!(o1 instanceof Comparable) || !(o2 instanceof Comparable)) {
      throw ...
   }
   if (o1.getClass() != o2.getClass()) {
      throw ...
   }
   return ((Comparable)o1).compareTo(o2);
}
这可能吗?或者我是否需要知道每个对象可能是什么,例如:

int compareThings(Object o1, Object o2) {
   if (o1 instanceof T1 && o2 instanceof T1) {
      return ((T1)o1).compareTo((T1)o2);
   }
   else if (o1 instanceof T2 && o2 instanceof T2) {
      return ((T2)o1).compareTo((T2)o2);
   }
   else if (o1 instanceof T3 && o2 instanceof T3) {
      return ((T3)o1).compareTo((T3)o2);
   }
   throw ...
}

,因此您不能对静态类型的对象调用
compareTo(…)
。我会阅读泛型。@Turing85,我不是在调用object.compareTo(对象),我是在调用Comparable.compareTo(对象)。您可以使用原始类型(正如您所做的那样)来执行此操作。但是要注意——如果您的输入是错误的,则无法在编译时捕获它,并且您得到的ClassCastException可能以令人惊讶的方式发生。泛型隐藏了大量的幕后施放,而且它并不总是在你“期望”的地方。@Wheezil你可以将你的方法定义为
公共静态整数比较(可比lhs,可比rhs)
。这样,您就可以忽略检查的
实例,其他一切都应该由对象的
compareTo(…)
实现来处理。因此,您不能在静态类型的对象
对象
上调用
compareTo(…)
。我会阅读泛型。@Turing85,我不是在调用object.compareTo(object),我调用Comparable.compareTo(Object)。您可以使用原始类型(正如您所做的那样)来实现这一点。但是要注意——如果您的输入是错误的,则无法在编译时捕获它,并且您得到的ClassCastException可能以令人惊讶的方式发生。泛型隐藏了大量的幕后施放,而且它并不总是在你“期望”的地方。@Wheezil你可以将你的方法定义为
公共静态整数比较(可比lhs,可比rhs)
。这样,您就可以忽略检查的
实例,其他一切都应该由对象的
比较(…)
实现来处理。