如何在Java类中实现运算符

10

我试图创建一个无符号整数类。

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

有没有一种方法来实现如下运算符:+、-、*、/、<<、>>、|、^、>>>以及<<?


4
Java 不支持运算符重载!但是 C# 支持~ ;) - Eng.Fouad
2
我想我在盯着树木看的时候错过了整片森林。 - Jay Tomten
7个回答

21

Java 不支持运算符重载。唯一的选择是像 add()subtract()multiply() 等方法一样定义方法,写出逻辑,并为特定操作调用它们。

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


2
这是一个很好的答案,我认为一些关于为什么在该语言中排除运算符重载的解释会对其有很大帮助 :) - Benjamin Gruenbaum
@BenjaminGruenbaum。我已经添加了一个链接到SO上的另一篇文章,其中描述了这个问题。 - Rohit Jain

9

已经有5个答案说你不能重载运算符,但是我想指出的是,你根本不能在对象上使用算术运算符。它们只适用于原始类型(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(尽管这是可能的)。

2
我喜欢这个有趣的结尾。那是一个优秀程序员的笑话。哦,Java确实有字符串操作。 - user9599745

4
不,你不能在Java中重载运算符。

4

在Java中不可能重载运算符。你可以定义方法来表示操作,例如标准库中的BigDecimalBigInteger


3
有一个名为“Java-OO”的 javac-plugin(类似于 Lombok 的注解处理器),它可以在 Java 中添加操作符重载。它允许您非常轻松地将运算符重载到您自己的类中。此外,当使用此插件时,Java API 的许多内置类也支持运算符重载。 (例如:您可以执行 list[6] 和 map["hello"] 而不是 list.get(6) 或 map.get("hello"))。
您只需要在使用 javac 进行编译时,在类路径上包含 .jar 文件即可。
所有主要 IDE 都有相应的插件:Eclipse、Netbeans 和 IntelliJ IDEA。

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

2

Java不支持运算符重载,他们认为这是一种不好的实践方式,虽然他们对String类重载了++=操作符。


这只是一半的真相。它是字符串的语法糖,并由javac转换为StringBuilder#append()调用。 - Cephalopod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接