如何在 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 上使用算术运算符。它们仅适用于原始类型(int
、double
等)。
以下代码编译的唯一原因
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) 在抽象基类中实现赋值运算符