【问题标题】:Does Java support operator overloading?Java 是否支持运算符重载?
【发布时间】:2012-02-11 21:41:53
【问题描述】:

我正在做一个项目,该项目有一个名为 Vector2 的对象

public static class Vector2 {
        public Vector2 (float x, float y) {
            this.x = x;
            this.y = y;
        }

        public float x;
        public float y;

        public static Vector2 ZERO = new Vector2 (0, 0);
        public static Vector2 FORWARD = new Vector2 (0, 1);
        public static Vector2 LEFT = new Vector2 (1, 0);

        public static float Distance (Vector2 a, Vector2 b) {
            return (float) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
        }
    }

并且想做以下事情:

Vector2 a = new Vector2 (2.32, 453.12);
Vector2 b = new Vector2 (35.32, 532.32);

Vector2 c = a * b;

// c.x = 2.32*35.32
// c.y = 453.12*532.32

float num = 5;
c = a * num;

// c.x = 2.32*5
// c.y = 453.12*5

这可能吗?如果是这样,我该怎么做,它叫什么?提前致谢。

【问题讨论】:

    标签: java object operator-keyword


    【解决方案1】:

    不,Java 不支持运算符重载。

    仅供参考:如果您可以使用其他语言,那么 C++ 和非常类似于 Java 的 C# 确实支持运算符重载。如果您的项目(例如 Ray Tracing)有很多与矢量相关的操作,那么我实际上会考虑使用 C# 之类的语言。

    【讨论】:

      【解决方案2】:

      Java 不允许像 C++ 等语言那样重载运算符。见this article。制作实用函数以适应您想要完成的任务。

      【讨论】:

        【解决方案3】:

        Java 中没有运算符重载。你能做的最好的就是使用一种方法。

        public Vector2 multiply(Vector2 that){
            return new Vector2(this.x * that.x, this.y * that.y);
        }
        

        那么如果 abVector2 对象,你可以这样做

        Vector2 c = a.multiply(b);
        

        【讨论】:

          【解决方案4】:

          正如 Nadir 所说,它被称为“运算符重载”,并且(无论好坏)它并未包含在 Java 规范中。如果你想看到它的实际效果,你可以在 C++ 中找到它。

          在 Java 中,您需要将以下方法添加到您的 Vector2 类中:

          public Vector2 multiplyBy(Vector2 otherVector);
          
          public Vector2 multiplyBy(float multiplier);
          

          【讨论】:

            【解决方案5】:

            您所做的称为运算符重载。虽然 Java 不支持它(谷歌可以找到无数关于该主题的帖子和意见),但一些在 JVM 上运行的高级语言支持它,比如 Groovy。因此,如果您能够将 Groovy 引入您的项目中,您就可以做到这一点。您的 Groovy 代码将编译为相同的 JVM 字节码,因此将与您的 Java 完全互操作,并且可以调用您项目中现有的 Java。

            http://groovy.codehaus.org/Operator+Overloading

            【讨论】:

              猜你喜欢
              • 2012-04-25
              • 2011-09-06
              • 1970-01-01
              • 2014-07-31
              • 2019-10-22
              • 2011-08-27
              • 1970-01-01
              • 2022-06-29
              • 1970-01-01
              相关资源
              最近更新 更多