답변:
아니요, Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. "custom"연산자 오버로딩에 근접한 Java의 유일한 측면은 문자열에 대한 + 처리입니다. 이는 상수의 컴파일 타임 연결 또는 StringBuilder / StringBuffer를 사용한 실행 시간 연결을 초래합니다. 같은 방식으로 작동하는 자체 연산자를 정의 할 수 없습니다.
자바처럼 (및 JVM 기반) 언어에 대해 수행 지원 연산자 오버로딩을, 당신은 볼 수 있었다 코 틀린 또는 멋져요 . 또는 Java 컴파일러 플러그인 솔루션으로 운이 좋을 수도 있습니다 .
BigInteger
Java에서 사용하는 코드를 본 다음 BigInteger
연산자를 사용하여 C #에서 사용 하는 유사한 코드를보십시오 . 대리인이 OOP 원칙을 어기는 방법을 모르겠습니다. 반대 의견보다 훨씬 더 정확해야합니다. Java 디자이너가 다양한 기능을 포함하지 않은 이유에 대한 세부 정보는 알지 못하지만 리소스 압력과 언어를 작고 비교적 단순하게 유지하려는 열망이 혼합되어 있다고 생각합니다.
m0
A와 Matrix
와 v0
, v1
, v2
, v3
,와 v4
같은 Vector
S, 단순히 당신이하는 데 걸리는 시간을 비교 올바르게 다음과 같은 수식을 해석 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는 내부 연산자 오버로드를 지원하지만 사용자 정의는 지원하지 않는다고 말할 수 있습니다.