답변:
아니요, Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. "custom"연산자 오버로딩에 근접한 Java의 유일한 측면은 문자열에 대한 + 처리입니다. 이는 상수의 컴파일 타임 연결 또는 StringBuilder / StringBuffer를 사용한 실행 시간 연결을 초래합니다. 같은 방식으로 작동하는 자체 연산자를 정의 할 수 없습니다.
자바처럼 (및 JVM 기반) 언어에 대해 수행 지원 연산자 오버로딩을, 당신은 볼 수 있었다 코 틀린 또는 멋져요 . 또는 Java 컴파일러 플러그인 솔루션으로 운이 좋을 수도 있습니다 .
BigIntegerJava에서 사용하는 코드를 본 다음 BigInteger연산자를 사용하여 C #에서 사용 하는 유사한 코드를보십시오 . 대리인이 OOP 원칙을 어기는 방법을 모르겠습니다. 반대 의견보다 훨씬 더 정확해야합니다. Java 디자이너가 다양한 기능을 포함하지 않은 이유에 대한 세부 정보는 알지 못하지만 리소스 압력과 언어를 작고 비교적 단순하게 유지하려는 열망이 혼합되어 있다고 생각합니다.
m0A와 Matrix와 v0, v1, v2, v3,와 v4같은 VectorS, 단순히 당신이하는 데 걸리는 시간을 비교 올바르게 다음과 같은 수식을 해석 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는 사용자 정의 연산자 오버로드를 지원하지 않습니다.
어쩌면 이것은 주제가 아닌 것일 수도 있지만 일부 답변에서 읽은 내용에 대해 언급하고 싶습니다.
가독성에 관하여.
비교:
다시 봐!
어느 것이 더 읽기 쉬운가?
사용자 정의 형식을 만들 수있는 프로그래밍 언어는 내장 형식 (또는 기본 형식)과 같은 방식으로 작동 할 수 있어야합니다.
따라서 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 평등과 정체성이 어떻게 혼동되는지 주목하십시오. == (같음) 기호는 다음을 의미
합니다. 기본 유형의 평등
비. 따라서 사용자 정의 형식에 대한 신원 확인을 위해 equals () 함수를 동등 하게 사용해야합니다 .
하지만 ... 연산자 오버로딩과 어떤 관련이 있습니까?
언어가 연산자 오버로드를 허용하는 경우 사용자는 항등 연산자에 적절한 의미를 부여 할 수 있습니다.
==는 C 및 C ++에서와 같이 Java에서 평등에 사용됩니다. 이것은 연산자 오버로드와 관련이 없습니다.
Java Operator Overloading을 시도 할 수 있습니다 . 자체 제한이 있지만 연산자 오버로드를 실제로 사용하려는 경우 시도해 볼 가치가 있습니다.
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
}
}
공식 웹 사이트에는 각 운영자를 위해 구현할 메소드 목록이 있습니다!
또는 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
누가 그루비가되고 싶지 않습니까? :디
아니요 Java에서 컴파일 된 groovy JAR을 동일한 방식으로 사용할 수 없습니다. 여전히 Java의 컴파일러 오류입니다.
C ++와 달리 Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. 오버로드는 자바에서 내부적으로 수행됩니다.
+예를 들어 (더하기)를 취할 수 있습니다 .
int a = 2 + 4;
string = "hello" + "world";
여기에 plus는 두 개의 정수를 더하고 두 개의 문자열을 연결합니다. 따라서 Java는 내부 연산자 오버로드를 지원하지만 사용자 정의는 지원하지 않는다고 말할 수 있습니다.