【问题标题】:Using operators with objects in Java在 Java 中对对象使用运算符
【发布时间】:2015-08-20 09:43:19
【问题描述】:

假设我们有一个类如下:

public class Time{
 int hour;
 int min;
 Time(int hour,int m){
  hour=h;
  min=m;
 }
 public String toString(){
 return hour+":"+min;
 }
}

我想在 main 中编写一些这样的代码,结果与 cmets 中一样:

Time t1 = new Time(13,45);
Time t2= new Time(12,05);
System.out.println(t1>=t2); // true
System.out.println(t1<t2);  // false
System.out.println(t1+4);   // 17:45
System.out.println(t1-t2);  // 1:40
System.out.println(t1+t2);  // 1:50 (actually 25:50)
System.out.println(t2++);   // 13:05

我可以通过接口等来做到这一点,还是我唯一能做的就是编写方法而不是使用运算符?

提前致谢。

【问题讨论】:

  • 没有。 Java 不支持运算符重载。
  • 谢谢。我不知道我们称之为:“运算符重载”。那我就用C++吧。

标签: java object operators


【解决方案1】:

这称为运算符重载,Java 不支持:Operator overloading in Java

所以是的,你必须坚持使用方法。

编辑:正如一些 cmets 所说,您可以实现 Comparable 来制作自己的 compareTo 方法https://stackoverflow.com/a/32114946/3779214

【讨论】:

    【解决方案2】:

    你根本做不到。您不能重载运算符。您需要编写方法来支持这些运算符。

    建议你写util方法,而不是Time方法。

    例如:

    System.out.println(TimeUtil.substract(t1,t2));
    

    【讨论】:

      【解决方案3】:

      您甚至可以实现类似的接口和 覆盖 compareTo 方法

      【讨论】:

        【解决方案4】:

        Java 不支持运算符重载。 (它可能会造成混淆,并且不适用于基于引用的语言:即使是不起眼的 == 也会导致很多与 Java 对象引用的混淆。

        对于您想要实现的一些方法,Java 中执行您想要的操作的惯用方式是实现Comparable&lt;T&gt;。然后 (1) 您的方法将是传统的,并且 (2) 您将能够将您的类的实例存储在集合和树图中。

        对于其他操作,比如减法,写一个函数subtract。仔细想想这应该返回什么。它应该是一个时间,还是一个时间间隔?我也质疑添加两个时间对象的有效性。

        【讨论】:

          【解决方案5】:

          Java 不允许运算符重载(here)。但是您可以向您的类添加一些功能,例如 muliply(Time t) 并手动编写它。要比较您的类,您可以集成Comparable-Interface,它可以让您添加所需的功能来比较两个类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-29
            • 1970-01-01
            相关资源
            最近更新 更多