请问您是否可以在Java中重载运算符?如果它在Java中的任何地方使用,请告诉我有关它的信息.
不,Java不支持用户定义的运算符重载.接近"自定义"运算符重载的Java的唯一方面是对字符串的处理,它导致常量的编译时连接或使用StringBuilder/StringBuffer的执行时连接.您无法定义自己的操作符,但操作方式相同.
对于Java类(和JVM为主)语言,不支持运算符重载,你可以看看Groovy的.或者,您可能会发现运行Java编译器插件解决方案.
运算符重载在Java中用于串联类型的串联:
String concat = "one" + "two";
但是,您无法定义自己的运算符重载.
除了指出所有的人都+
被重载字符串,-
也重载两个浮点和整数运算,因为是*
和/
.
[edit]
%
也为浮点重载,对于那些具有C或C++背景的人来说这可能有些意外.
Java不允许运算符重载.首选方法是在类上定义一个方法来执行操作:a.add(b)
而不是a + b
.您可以在此处看到Java从C语言中遗漏的其他位的摘要:从C和C++中删除的功能
由于Java不允许运算符重载,因此您无法自己执行此操作.
但是有一个例外.String对象重载+和+ =.
可以尝试Java运算符重载.它有自己的局限性,但如果你真的想使用运算符重载,那值得尝试.
正如许多其他人所回答的那样:Java不支持用户定义的运算符重载.
也许这是偏离主题的,但我想评论我在一些答案中读到的一些内容.
关于可读性.
相比:
c = a + b
c = a.add(b)
再看一遍!
哪一个更具可读性?
允许创建用户定义类型的编程语言应该允许它们以与内置类型(或基本类型)相同的方式运行.
所以Java打破了通用编程的基本原则:
我们应该能够将内置类型的对象与用户定义类型的对象交换.
(你可能想知道:"他说'内置'的对象了吗?".是的,请看这里.)
关于字符串连接:
数学家使用symnol +对集合进行交换操作.
所以我们可以确定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中的平等和身份是如何混淆的.==(相等)符号表示:
a.原始类型的平等
b.因此,我们不得不使用函数 equals()来进行相等性的身份检查.
但是......这与运营商重载有什么关系?
如果语言允许操作符重载,则用户可以为相等运算符赋予正确的含义.
只需将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 } }
在官方网站上,列出了为每个运营商实施的方法!
或者,您可以创建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的编译器错误.