赞
踩
不,Java不支持用户定义的运算符重载。 接近“自定义”运算符重载的Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder / StringBuffer导致了执行时间连接。 你不能定义你自己的操作符,但是它们的行为方式是一样的。
对于支持运算符重载的类Java(和基于JVM的)语言,您可以看看Groovy 。 或者,您可能会发现Java编译器插件解决scheme的运气。
运算符重载在Java中用于串联stringtypes:
String concat = "one" + "two";
但是,您不能定义自己的操作符重载。
除了所有的人指出+为string重载外, -对于浮点和整数操作也是重载的,就像*和/ 。
%也是浮点重载的,对于那些C或C ++背景的人来说,这可能有些让人吃惊。
Java不允许运算符重载。 首选的方法是在您的类上定义一个方法来执行该操作: a.add(b)而不是a + b 。 你可以在这里看到C语言中剩下的其他位的摘要: 特性从C和C ++中删除
你不能自己做这个,因为Java不允许操作符重载。
但是有一个例外。 对于String对象, +和+ =被重载。
可以尝试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不支持用户定义的操作符重载。
也许这是脱离主题,但我想评论一些事情,我读了一些答案。
关于可读性。
比较:
c = a + b
c = a.add(b)
再看一遍!
哪一个更可读?
允许创build用户定义types的编程语言应该允许它们以与内置types(或基本types)相同的方式进行操作。
所以Java打破了generics编程的一个基本原则:
我们应该能够将内置types的对象与用户定义types的对象进行交换。
(你可能想知道:“他说了'内置的东西'吗?”是的, 看这里) 。
关于string连接:
math家使用symnol +进行交换操作。
所以我们可以肯定a + b = b + a。
string连接(在大多数编程语言中)并不尊重这种常见的math符号。
a := "hello"; b := "world"; c := (a + b = b + a);
或在Java中:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
额外:
注意Java中的平等和身份是如何混淆的。 ==(相等)符号表示:
一个。 平等原始types
湾 用户定义types的身份检查,因此,我们被迫使用equals() 函数进行相等。
但是…这与操作符重载有什么关系?
如果语言允许运算符重载,则可以给相等运算符赋予适当的含义。
或者,您可以创buildJava 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的编译器错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。