Answers:
不,Java不支持用户定义的运算符重载。Java唯一接近“自定义”运算符重载的方面是对字符串的+处理,这将导致常量的编译时串联或使用StringBuilder / StringBuffer的执行时串联。但是,您无法定义自己的操作符,它们的操作方式相同。
对于确实支持运算符重载的类似Java(和基于JVM)的语言,您可以查看Kotlin或Groovy。另外,您可能会发现Java编译器插件解决方案很幸运。
BigInteger
Java 中使用的代码,然后查看BigInteger
C#中使用运算符的类似代码。我看不到代表如何违反OOP原则-与反对相比,您需要更加精确。我不知道为什么Java设计人员不包括各种功能的细节,但是我怀疑资源压力和保持语言较小且相对简单的愿望混合在一起。
m0
作为Matrix
和v0
,v1
,v2
,v3
,和v4
为Vector
S,简单地比较需要多长时间你正确地理解下面的数学表达式m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
。如果已包含对运算符重载的支持,则可以将其写为m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
。
Java不允许运算符重载。首选方法是在类上定义一个方法来执行操作:a.add(b)
而不是a + b
。您可以在此处查看从类似C的语言中遗漏的Java其他部分的摘要:从C和C ++中删除的功能
正如许多其他人回答的那样:Java不支持用户定义的运算符重载。
也许这是题外话,但我想对我在某些答案中读到的一些东西发表评论。
关于可读性。
比较:
再看一次!
哪一个更具可读性?
允许创建用户定义类型的编程语言应允许它们以与内置类型(或原始类型)相同的方式运行。
因此,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。用户定义类型的身份检查,因此,我们被迫使用equals()函数实现相等性。
但是...这与运算符重载有什么关系?
如果语言允许运算符重载,则用户可以为相等运算符赋予适当的含义。
==
与C和C ++一样,该符号在Java中用于相等性。这与操作符重载无关。
可以尝试Java操作符重载。它有其自身的局限性,但是如果您真的想使用运算符重载,则值得尝试。
只需将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
谁不想成为/使用常规?:D
不,您不能以相同的方式在Java中使用已编译的Groovy JAR。它仍然是Java的编译器错误。