【问题标题】:Is it possible to create a custom operator in Java?是否可以在 Java 中创建自定义运算符?
【发布时间】:2012-05-04 12:02:43
【问题描述】:

类似于Is it possible to create a new operator in c#?,是否可以为Java 创建自己的运算符?我最初会说不,因为您不能重载,但话又说回来,String 支持 + 和 +=(在执行时通过 StringBuilder 隐式等)。

【问题讨论】:

    标签: java operator-keyword


    【解决方案1】:

    不,Java 不能以这种方式扩展。你不能添加操作符,你甚至不能进一步重载像+这样的内置操作符——即使是像BigInteger这样的标准库类也必须使用像add()这样的方法,而不是像+这样的操作符。

    Scala(另一种静态 JVM 语言)通过使用方法调用而不是内置运算符来解决这个问题,并允许方法名称中包含任何字符,因此您可以定义看起来是运算符的新方法,即

    a + 1
    

    是语法糖:

    a.+(1)
    

    【讨论】:

      【解决方案2】:

      Java 不允许这样做。

      但是,如果您想实现这种语法同时能够在 JVM(以及其他 Java 代码)上运行您的代码,您可以查看具有 operator overloading 的 Groovy(您还可以使用它将 DSL 用于短语法,其效果与使用自定义运算符类似)。

      请注意,在任何语言中定义自定义运算符(不仅仅是重载)都是一件大事,因为您必须能够以某种方式更改词法分析器和语法。

      【讨论】:

      • 也就是说,Java 没有运算符重载是一个经过深思熟虑的决定——您可能会发现最好避免此类事情。
      • @LouisWasserman:正如我在另一条评论中所说,我理解这个决定,但不幸的是,这并不能使 Java 非常适合数学编程。对于矩阵,a.multiply(b.multiply(c.add(d)).add(e)) 不是很好...... NumPy 在 Python 中很好地使用了运算符重载。
      • 死链接?它不适合我。
      【解决方案3】:

      不,您不能为 Java 中的运算符重载特殊符号。

      【讨论】:

      • 我不是要求超载。我要求创建一个新符号。
      • 在您的问题中,您同时使用了“new”和“overload”这两个术语,因此有点令人困惑。
      【解决方案4】:

      正如所有其他人所说,您绝对不能在 Java 中添加新的运算符。但是,其他对 Java 友好的 JVM 语言(例如 Groovy)将允许您从现有的操作符标记中定义新的操作符。

      【讨论】:

        【解决方案5】:

        没有。阅读这篇文章,了解为什么它们不应该是: http://java.dzone.com/articles/why-java-doesnt-need-operator

        您可以使用其他语言(例如 Scala)在 Java 平台上实现此目的。 - https://stackoverflow.com/a/1991348/1342121

        【讨论】:

        • 那篇文章显然是由一个没有用 Java 写过任何数字代码的人写的。与必须在任何地方调用 RealMatrix.multiply(RealMatrix) 之类的方法相比,能够在 Python 中使用 NumPy 将矩阵与运算符重载相乘(例如)对于可读性来说非常方便。
        • 同意...我并没有做太多这方面的工作,Java 语言似乎也不是最好的选择。 Java 平台非常适合它
        【解决方案6】:

        没有。 Java 不允许运算符重载。您可以在此处查看更多讨论:https://javarevisited.blogspot.com/2011/08/why-java-does-not-support-operator.html

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
        • @DavidBuck 答案是 “不。Java 不允许运算符重载。”,该链接仅支持该声明。换句话说,这不是一个仅链接的答案。
        • @DavidBuck, MarkRotteveel:我最初打算写评论,但我的声誉还不够。谢谢大家的好意,我下次作为贡献者会更好。
        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 2023-03-23
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        相关资源
        最近更新 更多