Jon*_*eet 224
不,Java不支持用户定义的运算符重载.接近"自定义"运算符重载的Java的唯一方面是对字符串的处理,它导致常量的编译时连接或使用StringBuilder/StringBuffer的执行时连接.您无法定义自己的操作符,但操作方式相同.
对于Java类(和JVM为主)语言,不支持运算符重载,你可以看看Groovy的.或者,您可能会发现运行Java编译器插件解决方案.
tea*_*bot 34
运算符重载在Java中用于串联类型的串联:
String concat = "one" + "two";
Run Code Online (Sandbox Code Playgroud)
但是,您无法定义自己的运算符重载.
rob*_*rob 18
Java不允许运算符重载.首选方法是在类上定义一个方法来执行操作:a.add(b)而不是a + b.您可以在此处看到Java从C语言中遗漏的其他位的摘要:从C和C++中删除的功能
Bri*_*new 14
由于Java不允许运算符重载,因此您无法自己执行此操作.
但是有一个例外.String对象重载+和+ =.
Fer*_*oni 10
正如许多其他人所回答的那样:Java不支持用户定义的运算符重载.
也许这是偏离主题的,但我想评论我在一些答案中读到的一些内容.
关于可读性.
相比:
再看一遍!
哪一个更具可读性?
允许创建用户定义类型的编程语言应该允许它们以与内置类型(或基本类型)相同的方式运行.
所以Java打破了通用编程的基本原则:
我们应该能够将内置类型的对象与用户定义类型的对象交换.
(你可能想知道:"他说'内置'的对象了吗?".是的,请看这里.)
关于字符串连接:
数学家使用symnol +对集合进行交换操作.
所以我们可以确定a + b = b + a.
字符串连接(在大多数编程语言中)不遵循这种常见的数学符号.
Run Code Online (Sandbox Code Playgroud)a := "hello"; b := "world"; c := (a + b = b + a);
或者在Java中:
Run Code Online (Sandbox Code Playgroud)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
}
}
Run Code Online (Sandbox Code Playgroud)
在官方网站上,列出了为每个运营商实施的方法!
或者,您可以创建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
Run Code Online (Sandbox Code Playgroud)
谁不想/使用groovy?:d
不,你不能以相同的方式在Java中使用已编译的groovy JAR.它仍然是Java的编译器错误.
| 归档时间: |
|
| 查看次数: |
193933 次 |
| 最近记录: |