web-dev-qa-db-ja.com

Javaでの演算子のオーバーロード

Javaで演算子をオーバーロードできるかどうか教えてください。 Javaのどこかで使用されている場合、それについて教えてください。

163
Vipul

いいえ、Javaはユーザー定義の演算子のオーバーロードをサポートしていません。 「カスタム」演算子のオーバーロードに近いJavaの唯一の側面は、ストリングの+の処理です。これにより、コンパイル時の定数の連結またはStringBuilder/StringBufferを使用した実行時の連結が行われます。ただし、同じように動作する独自の演算子を定義することはできません。

doesが演算子のオーバーロードをサポートするJavaのような(およびJVMベースの)言語の場合、 Groovy を見ることができます。または、 Javaコンパイラプラグインソリューション で幸運を見つけるかもしれません。

217
Jon Skeet

演算子のオーバーロードは、String型の連結のためにJavaで使用されます。

String concat = "one" + "two";

ただし、cannot独自の演算子オーバーロードを定義します。

34
teabot

+が文字列に対してオーバーロードされることを指摘するすべての人々に加えて、-は、*および/と同様に、浮動小数点演算と整数演算の両方に対してもオーバーロードされます。

[編集] %も浮動小数点用にオーバーロードされています。これは、CまたはC++のバックグラウンドを持つ人にとってはちょっとした驚きかもしれません。

25
MSalters

Javaは、演算子のオーバーロードを許可しません。推奨されるアプローチは、クラスでメソッドを定義して、アクションを実行することです:a + bではなくa.add(b)。 Cのような言語から除外された他のビットJavaの概要は、次のとおりです。 CおよびC++から削除された機能

17
rob

Javaは演算子のオーバーロードを許可しないため、これを自分で行うことはできません。

ただし、one例外があります。 +および+ =は、Stringオブジェクトに対してオーバーロードされます。

14
Brian Agnew

Java Operator Overloading を試すことができます。独自の制限がありますが、本当に演算子のオーバーロードを使用する場合は試してみる価値があります。

11

他の多くの人が答えているように:Javaはユーザー定義の演算子のオーバーロードをサポートしていません。

たぶんこれはトピック外ですが、いくつかの答えで読んだことについてコメントしたいと思います。

読みやすさについて
比較:

  1. c = a + b
  2. 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。したがって、ユーザー定義型のIDチェックは、functionequals()を使用して同等にすることを強制されます。
しかし...これは演算子のオーバーロードとどう関係しますか?
言語で演算子のオーバーロードが許可されている場合、ユーザーは等価演算子に適切な意味を与えることができます。

Javaコードと共にXtendを使用するだけです。オペレーターのオーバーロードをサポートします。

    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
    }

}

公式ウェブサイトには、各オペレーターに実装するメソッドのリストがあります!

6
Aurelien B

または、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

いいえ、コンパイル済みのgroovy JARをJavaで同じ方法で使用することはできません。 Javaのコンパイラエラーのままです。

5
alknows

C++とは異なり、Javaはユーザー定義の演算子のオーバーロードをサポートしません。オーバーロードはJavaで内部的に行われます。exには+(プラス)を使用できます。inta = 2 + 4; 、string = "hello" + "world";ここでplusは2つの整数を追加し、2つの文字列を連結します。したがって、Javaは内部演算子のオーバーロードをサポートしていますが、ユーザー定義はサポートしていません。

0