【问题标题】:Compare operators custom object java比较运算符自定义对象 java
【发布时间】:2015-04-20 07:08:28
【问题描述】:

是否有支持对自定义对象进行比较操作的插件?

我想用这个:

class MyTemperatureObject implements Comparable<MyTemperatureObject> {
    ...
    @Override
    public int compareTo(MyTemperatureObject object) {
       return getValue().compareTo(object.getValue());
    }
}

MyTemperatureObject a;
MyTemperatureObject b;

if (a < b){
    ...
}

这给出了编译错误:

Operator '<' cannot be applied to MyTemperatureObject

但我认为编译器可以使用 Comparable 接口来评估这个。或者是否有理由认为这样做是不可能或不明智的。

我知道我可以使用 compareTo 函数

a.compareTo(b) < 0

但我认为这更易读/易于理解

 a < b

【问题讨论】:

  • I think this is better readable/understandable a&lt;b,在 Java 中不支持 MyTemperatureObject
  • 以后如果你对使用equals 方法而不是== 有另一个疑问,因为它更易读/易懂,那么请参考这个answer
  • 你不能在java中重载运算符!

标签: java compare operators


【解决方案1】:

在 Java 中,&lt; 运算符只能用于数字类型。编译器将不会自动应用compareTo 方法进行对象比较。

将你的条件改写如下:

if (a.compareTo(b) < 0){ /* ... */ }

compareTo 方法的语义在JavaDoc 中有明确记录,但本质上归结为:

返回负整数、零或正整数作为此对象 小于、等于或大于指定对象。

【讨论】:

  • 我觉得你也应该给他解释一下compareTo方法的返回值。
  • 我知道这个功能我已经实现了这个功能。但我想要的是不要使用这个功能。 a 更容易理解
  • 但是不支持这个有什么缺点呢?
  • 我没有看到任何直接的缺点。处理null 的情况可能会有点棘手,以及处理不兼容的类型。所有问题都可能或多或少优雅地解决,但我无法推测原始语言设计者的动机。
【解决方案2】:

如果你想在 C++ 运算符重载上做类似的事情:Wikipedia - C++ Operator Overloading,那么它在 java 上不存在。

【讨论】:

    【解决方案3】:

    您可以参考compareTo方法的文档。

    返回: 负整数、零或正整数,因为此对象小于、等于或大于指定对象。

    你可以使用 compareTo 方法。

    if (a.compareTo(b) < 0){
        // Your code
    }
    

    运算符“

    答案: Java 不支持运算符重载,而 C++ 支持它。所以您可以使用&lt; / &gt; 运算符仅用于数字比较。

    【讨论】:

      【解决方案4】:

      您必须使用调用 compareTo 方法的特定类, 看看这个教程,希望对你有帮助 http://www.tutorialspoint.com/java/java_using_comparator.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多