回答:
いいえ、Javaはユーザー定義の演算子オーバーロードをサポートしていません。「カスタム」演算子のオーバーロードに近いJavaの唯一の側面は、文字列の+の処理です。これにより、定数のコンパイル時の連結またはStringBuilder / StringBufferを使用した実行時の連結が行われます。ただし、同じように動作する独自の演算子を定義することはできません。
Javaのような(とJVMベースの)言語の場合はありませんサポート演算子のオーバーロードを、あなたが見て可能性がKotlinやGroovyの。または、Javaコンパイラプラグインソリューションで運が見つかるかもしれません。
BigInteger
Java で使用するコードを見て、次にBigInteger
C#で演算子を使用して同様のコードを見てください。デリゲートがOOPの原則をどのように破るかはわかりません。反対意見よりも正確である必要があります。Javaデザイナにさまざまな機能が含まれていなかった理由の詳細はわかりませんが、リソースのプレッシャーと、言語を小さくシンプルに保ちたいという欲求が混在しているのではないかと思います。
m0
として、Matrix
そしてv0
、v1
、v2
、v3
、およびv4
などVector
の、単にそれはあなたがするのにかかる時間の長さを比較正しく、次の数式を解釈します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
。JavaがCのような言語から除外された他のビットの要約をここで見ることができます:CおよびC ++から削除された機能
Javaでは演算子のオーバーロードが許可されていないため、これを自分で行うことはできません。
1つのただし例外です。+および+ =は、Stringオブジェクトに対してオーバーロードされます。
&
、|
、および^
のためにオーバーロードされているboolean
と整数型。実際、算術演算子と関係演算子は、さまざまな数値型に対して多重定義されています。(もちろん、オーバーロードのセマンティクスははるかに近い...)
他の多くの人が答えたように: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のコンパイラエラーです。
C ++とは異なり、Javaはユーザー定義の演算子のオーバーロードをサポートしていません。オーバーロードはJavaの内部で行われます。
+
(プラス)を例にとります。
int a = 2 + 4;
string = "hello" + "world";
ここで、plusは2つの整数を追加し、2つの文字列を連結します。したがって、Javaは内部演算子のオーバーロードをサポートしていますが、ユーザー定義はサポートしていないと言えます。