Відповіді:
Ні, Java не підтримує визначені користувачем перевантаження. Єдиний аспект Java, який наближається до "користувацького" оператора перевантаження, - це обробка + для рядків, що призводить до об'єднання констант у часі компіляції або конкатенації часу виконання за допомогою StringBuilder / StringBuffer. Ви не можете визначити власних операторів, які діють однаково.
Для Java-подібних (і JVM основі) мови , який робить перевантажувати підтримки оператора, ви можете подивитися на Котлін або Groovy . Крім того, вам може пощастити з рішенням для плагінів компілятора Java .
BigInteger
на Java, а потім подивіться на аналогічний код із BigInteger
використанням операторів C # за допомогою. Я не бачу, як делегати порушують принципи ООП - вам потрібно бути набагато точнішими, ніж це у ваших запереченнях. Я не знаю подробиць, чому дизайнери 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
. Тут ви можете ознайомитись з короткими мовами, викладеними з мови C, як тут: Особливості, вилучені з C та C ++
Ви не можете зробити це самостійно, оскільки Java не дозволяє перевантажувати оператора.
Однак за одним винятком. + і + = перевантажуються для об'єктів 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 плутається рівність та ідентичність. Символ == (рівність) означає:
a. Рівність для примітивних типів.
б. Перевірка ідентичності для визначених користувачем типів, тому ми змушені використовувати функцію equals () для рівності.
Але ... Що це стосується перевантаження оператора?
Якщо мова дозволяє оператору перевантажувати користувача, він може надати належного значення оператору рівності.
==
використовується для рівності в Java, як і в C і C ++. Це не має нічого спільного з перевантаженням оператора.
Можна спробувати перевантаження оператора 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
Хто не хоче бути / використовувати groovy? : D
Ні, ви не можете використовувати компільовані groovy JAR на Java однаково. Це все ще помилка компілятора для Java.
На відміну від C ++, Java не підтримує визначені користувачем перевантаження. Перевантаження робиться всередині java.
Ми можемо взяти +
(плюс), наприклад:
int a = 2 + 4;
string = "hello" + "world";
Тут плюс додає два цілих числа і об'єднує два рядки. Тож можна сказати, що Java підтримує внутрішню операційну перевантаження, але не визначену користувачем.