【问题标题】:How do I Implement Operators in a Java Class如何在 Java 类中实现运算符
【发布时间】:2013-01-27 21:03:48
【问题描述】:

我正在尝试创建一个无符号整数类。

public class UnsignedInteger extends Number implements Comparable<UnsignedInteger> 
    { 
    ... 
    }

有没有办法实现运算符,例如; +、-、*、/、>、|、^、>>>、

【问题讨论】:

  • Java 不支持重载运算符! C# 确实~ ;)
  • 我想我在看树的时候错过了森林。

标签: java operators


【解决方案1】:

有一个名为“Java-OO”的 javac 插件(像 Lombok 一样的注解处理器),它为 Java 添加了运算符重载。

它允许您非常轻松地将运算符重载添加到您自己的类中。除此之外,Java API 的许多内置类在使用此插件时也支持运算符重载。 (例如:代替 list.get(6) 或 map.get("hello") 您可以使用 list[6] 和 map["hello"])

您需要做的就是在使用 javac 编译时将 .jar 包含在类路径中。

所有主要 IDE 都有插件:Eclipse、Netbeans 和 IntelliJ IDEA。

【讨论】:

    【解决方案2】:

    Java does not support Operator Overloading。您唯一的选择是定义add()subtract()multiply() 等方法,并在其中编写逻辑,然后为特定操作调用它们。

    您可以查看BigInteger 类,了解如何定义方法来支持各种操作。如果有兴趣,您甚至可以查看源代码,您可以在 jdk 主目录的 src 文件夹中找到它。

    【讨论】:

    • 这是一个很好的答案,我认为关于 why 运算符重载的一些解释被排除在语言之外会增加很多:)
    • @BenjaminGruenbaum。我在 SO 上添加了另一个帖子的链接,其中描述了这一点。
    【解决方案3】:

    已经有 5 个答案说你不能重载运算符,但我想指出你根本不能在 objects 上使用算术运算符。它们仅适用于原始类型(intdouble 等)。

    以下代码编译的唯一原因

    Integer a = 1, b = 2;
    Integer c = a + b;
    

    是因为Java编译器将其编译为

    Integer a = Integer.valueOf(1), b = Integer.valueOf(2);
    Integer c = Integer.valueOf(a.intValue() + b.intValue());
    

    如果您希望它适用于您的UnsignedInteger,您必须扩展 javac(虽然有可能)。

    【讨论】:

    • 我给这个有趣的结局点个赞。这是一个很好的程序员笑话。哦,java确实有字符串操作
    【解决方案4】:

    Java 不支持运算符重载,他们认为这是一种不好的做法,因为他们知道他们为 String 类重载了 ++= 运算符

    【讨论】:

    • 这只是对了一半。它是字符串的语法糖,由 javac 转换为 StringBuilder#append() 调用。
    【解决方案5】:

    在 Java 中无法覆盖运算符。您可以做的是定义表示操作的方法,例如标准库中的BigDecimalBigInteger

    【讨论】:

      【解决方案6】:

      没有。 Java 不支持运算符重载。

      【讨论】:

        【解决方案7】:

        不,您不能覆盖 Java 中的运算符。

        【讨论】:

          猜你喜欢
          • 2019-02-16
          • 2013-03-17
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-31
          相关资源
          最近更新 更多