Java 中的运算符重载

问题描述 投票:0回答:12

请告诉我Java中是否可以重载运算符?如果它在 Java 中的任何地方使用,请告诉我。

java operator-overloading
12个回答
263
投票

不,Java不支持用户定义的运算符重载。 Java 唯一接近“自定义”运算符重载的方面是对字符串的 + 处理,这会导致常量的编译时连接或使用 StringBuilder/StringBuffer 的执行时连接。但您无法定义自己的运算符,它们的作用方式相同。

对于支持运算符重载的类似 Java(和基于 JVM)的语言,您可以查看 KotlinGroovy。或者,您可能会发现 Java 编译器插件解决方案很幸运。


38
投票
Java 中使用运算符重载来连接 String 类型:

String concat = "one" + "two";

但是,您

不能定义自己的运算符重载。


26
投票
除了所有指出

+

 对于字符串重载之外,
-
 对于浮点和整数运算也重载,就像 
*
/
 一样。 

[编辑]

%

 对于浮点也是重载的,这对于那些具有 C 或 C++ 背景的人来说可能有点令人惊讶。


21
投票
Java不允许运算符重载。首选方法是在类上定义一个方法来执行操作:

a.add(b)

而不是
a + b
。您可以在此处查看 Java 从类似 C 语言中遗漏的其他部分的摘要:
从 C 和 C++ 中删除的功能


19
投票
正如许多其他人的回答:Java 不支持用户定义的运算符重载。

也许这是题外话,但我想对我在一些答案中读到的一些内容发表评论。

关于可读性。 比较:

    c = a + b
  1. c = a.add(b)
再看一遍!


哪一个更具可读性?

允许创建用户定义类型的编程语言,应该允许它们以与内置类型(或基本类型)相同的方式运行。

因此 Java 打破了通用编程的基本原则:


我们应该能够将内置类型的对象与用户定义类型的对象互换。 (您可能想知道:“他有说‘内置对象’吗?”。是的,
参见这里。)

关于字符串连接:

数学家使用符号 + 进行集合的交换运算。

所以我们可以确定a + b = b + a。
字符串连接(在大多数编程语言中)不尊重这种常见的数学符号。

a := "hello"; b := "world"; c := (a + b = b + a);

或者用Java:

String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);

额外:

请注意,在 Java 中,相等性和同一性是如何混淆的。 ==(相等)符号的含义是:
一个。原始类型的平等。
b.对用户定义类型进行身份检查,因此,我们被迫使用
function equals() 来实现相等性。 但是...这与运算符重载有什么关系?
如果语言允许运算符重载,则用户可以为相等运算符赋予正确的含义。


17
投票
您无法自己执行此操作,因为 Java 不允许运算符重载。

但是,有

一个例外。 ++= 对于 String 对象是重载的。



9
投票
只需将 Xtend 与 Java 代码一起使用即可。它支持运算符重载:

package com.example; @SuppressWarnings("all") public class Test { protected int wrapped; public Test(final int value) { this.wrapped = value; } public int operator_plus(final Test e2) { return (this.wrapped + e2.wrapped); } } package com.example class Test2 { new() { val t1 = new Test(3) val t2 = new Test(5) val t3 = t1 + t2 } }

官方网站上有每个运营商要实施的方法列表!


5
投票
或者,您可以制作 Java

Groovy 并重载这些函数来实现您想要的

//plus() => for the + operator //multiply() => for the * operator //leftShift() = for the << operator // ... and so on ... class Fish { def leftShift(Fish fish) { print "You just << (left shifted) some fish " } } def fish = new Fish() def fish2 = new Fish() fish << fish2

谁不想成为/使用 groovy? :D

不,您不能以同样的方式在 Java 中使用已编译的 groovy JAR。它仍然是 Java 的编译器错误。


2
投票
与C++不同,Java不支持用户定义的运算符重载。重载是在 java 内部完成的。

我们可以以

+

(加号)为例:

int a = 2 + 4; string = "hello" + "world";

这里,plus 将两个整数相加并连接两个字符串。所以我们可以说Java支持内部运算符重载,但不支持用户定义。


1
投票
Java 不支持开箱即用,但有一个编译器插件形式的解决方案,它允许您做到这一点。

请参阅这篇关于 id 的文章

https://foojay.io/today/operator-overloading-in-java/

插件是

http://manifold.systems/


0
投票
Если сильно захотеть перегрузить оператор, можно сделать препроцессор для аннотации и заменять выражения a + b, a += b a.add(b), a = a.add(b) 我的想法是错误的。来自示例:

https://github.com/AxeFu/OperatorOverloadingJava

© www.soinside.com 2019 - 2024. All rights reserved.