当前位置:  开发笔记 > 编程语言 > 正文

运算符在Java中重载

如何解决《运算符在Java中重载》经验,为你挑选了9个好方法。

请问您是否可以在Java中重载运算符?如果它在Java中的任何地方使用,请告诉我有关它的信息.



1> Jon Skeet..:

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

对于Java类(和JVM为主)语言,支持运算符重载,你可以看看Groovy的.或者,您可能会发现运行Java编译器插件解决方案.


@djaqeel:运算符重载使得代码在可用性差*时使用不当*.如果使用得当,它可以大大提高IMO的可读性.查看在Java中使用`BigInteger`的代码,然后使用运算符在C#中使用`BigInteger`查看类似的代码.我没有看到代表们如何打破OOP原则 - 你需要比反对意见更精确.我不知道为什么Java设计师没有包含各种功能的细节,但我怀疑存在资源压力和希望保持语言小而相对简单的混合.
你说我们不能在java中创建包装器?比如像Integer这样的SmallInteger?

2> teabot..:

运算符重载在Java中用于串联类型的串联:

String concat = "one" + "two";

但是,您无法定义自己的运算符重载.



3> MSalters..:

除了指出所有的人都+被重载字符串,-也重载两个浮点和整数运算,因为是*/.

[edit] %也为浮点重载,对于那些具有C或C++背景的人来说这可能有些意外.



4> rob..:

Java不允许运算符重载.首选方法是在类上定义一个方法来执行操作:a.add(b)而不是a + b.您可以在此处看到Java从C语言中遗漏的其他位的摘要:从C和C++中删除的功能


重要的是使Java源文件与上下文无关的设计目标.尝试阅读非常大(MLOC),宏重C程序有一个很长的学习曲线.与小型Java程序相比,可比较(或更大)的Java程序并不难.正如Gosling所说:蓝领程序员的工作语言.[而且任何认为样板冗长都是有害的人应该阅读专家认知中的分块.]
多亏了oracle,java.sun.com链接均无法正常工作。如果可以,请提供更新的链接吗?

5> Brian Agnew..:

由于Java不允许运算符重载,因此您无法自己执行此操作.

但是有一个例外.String对象重载++ =.


Java中有许多其他运算符重载的例子.例如```,`|`和`^`是`boolean`和整数类型的重载.事实上,算术和关系运算符因各种数字类型而过载.(当然,重载的语义更接近......)

6> Alexander Mi..:

可以尝试Java运算符重载.它有自己的局限性,但如果你真的想使用运算符重载,那值得尝试.



7> Fernando Pel..:

正如许多其他人所回答的那样: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()来进行相等性的身份检查.
但是......这与运营商重载有什么关系?
如果语言允许操作符重载,则用户可以为相等运算符赋予正确的含义.


所以你在第一次评论中所说的是错误的.对?请告诉我如何在C中测试用户定义类型的相等性和身份.你是对的,我关于平等的评论是OT,但我澄清了(参见"额外").我没有创建编程语言的事实并不意味着我不能批评现有的编程语言.如果你把批评视为宗教战争,我很抱歉.
operator ==,在Java中仅表示基本类型的Equality.对于用户定义的类型,意味着身份.在C++中,语义是由用户定义的,但是应该保留内置的语义,相等.字符串a ="你好"; 字符串b ="你好"; boolean c =(a == b);

8> Aurelien B..:

只需将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
    }

}

在官方网站上,列出了为每个运营商实施的方法!



9> alknows..:

或者,您可以创建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的编译器错误.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有