【问题标题】:How to know if two objects are comparable to each other?如何知道两个对象是否可以相互比较?
【发布时间】:2015-01-27 11:37:18
【问题描述】:

我想写一个通用比较器,它可以比较任何类的对象。我希望先出现数字,然后是字符串,然后是所有其他可比较的对象。

我先写了

@SuppressWarnings({ "unchecked", "rawtypes" })
            @Override
            public int compare(Object o1, Object o2) {

                if( o1 instanceof Number && !(o2 instanceof Number) ) {
                    return -1;
                }
                else if( o2 instanceof Number && !(o1 instanceof Number) ) {
                    return +1;
                }
                else if( o1 instanceof String && !(o2 instanceof String) ) {
                    return -1;
                }
                else if( o2 instanceof String && !(o1 instanceof String) ) {
                    return +1;
                }
                else if( o1 instanceof Comparable && !(o2 instanceof Comparable) ) {
                    return -1;
                }
                else if( o2 instanceof Comparable && !(o1 instanceof Comparable) ) {
                    return +1;
                }
                else if( o1 instanceof Comparable && o2 instanceof Comparable ) {
                    return ((Comparable)o1).compareTo(o2);
                }
                else {
                    return o1.hashCode() - o2.hashCode();
                }
            }

我在想支票

o1 instanceof Comparable && o2 instanceof Comparable

会给我比较数字、字符串和所有其他可比较的类。

但后来我发现Number 是不可比较的,即我不能用它来比较双精度数和整数。

我还发现,Comparable<T> 合同是模糊的。虽然T 可以是任何类,但实际上它可能应该是实现它的同一个类...

那么,如何实现呢?

【问题讨论】:

  • 我想写通用比较器 你总会遇到一些你没有正确处理或根本没有处理的情况。它会给你带来更多的麻烦,而不是解决问题。
  • 没有正确的方法可以做到这一点,因为这实际上是不可能的。
  • 那么标题问题的答案是什么?

标签: java comparable


【解决方案1】:

假设将来某个时候您创建了一些 Apple 类的实例和一些 Orange 类的实例。你今天写的通用比较算法怎么可能在未来将那些 Apple 实例与 Orange 实例进行比较呢?我认为您需要重新考虑您要完成的工作,并可能在尝试比较它们之前确保您的对象属于同一类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多