如何在 Java 类中实现运算符

Posted

技术标签:

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

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

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

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

【问题讨论】:

Java 不支持重载运算符! C# 确实~ ;) 我想我在看树的时候错过了森林。 【参考方案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 中无法覆盖运算符。您可以做的是定义表示操作的方法,例如标准库中的BigDecimal 或BigInteger。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于如何在 Java 类中实现运算符的主要内容,如果未能解决你的问题,请参考以下文章

使用奇怪的重复模板模式 (CRTP) 在抽象基类中实现赋值运算符

用代码说话:如何在Java中实现线程

具有抽象继承的后缀运算符++

在模板(Django)中实现归档日历时出现 IF 运算符错误

如何在 Java 中实现无穷大?

delphi 请问如何在SQL语句中实现对 Binary 类型的位运算?