Yanıtlar:
Hayır, Java kullanıcı tanımlı operatör aşırı yüklemesini desteklemez. Java'nın "özel" operatör aşırı yüklemesine yaklaşan tek yönü, dizeler için + 'nın işlenmesidir. Yine de aynı şekilde hareket eden kendi operatörlerinizi tanımlayamazsınız.
Java gibi (ve JVM tabanlı) dil için yaptığı destek operatörü aşırı yüklenmesini, bakmak olabilir KOTLIN veya Groovy . Alternatif olarak, şansınızı bir Java derleyici eklenti çözümü ile bulabilirsiniz .
BigInteger
Java, ardından kullanarak benzer kod bakmak BigInteger
operatörlerini kullanarak C #. Delegelerin OOP ilkelerini nasıl ihlal ettiğini görmüyorum - itirazlarınızdakinden çok daha kesin olmanız gerekiyor. Java tasarımcılarının neden çeşitli özellikler içermediğinin ayrıntılarını bilmiyorum, ancak kaynak baskısının bir karışımı ve dili küçük ve nispeten basit tutma arzusu olduğundan şüpheleniyorum.
m0
bir şekilde Matrix
ve v0
, v1
, v2
, v3
, ve v4
yanı Vector
s, basitçe size ne kadar sürdüğünü karşılaştırmak doğru aşağıdaki matematiksel ifadeyi yorumlamak m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Operatör aşırı yüklemesi için destek dahil edilmiş olsaydı, olarak yazılabilirdi m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.
Java, operatörün aşırı yüklenmesine izin vermez. Tercih edilen yaklaşım, sınıfınızda eylemi gerçekleştirmek için bir yöntem tanımlamaktır: a.add(b)
yerine a + b
. Java gibi C gibi diller dışında kalan diğer bitlerin bir özetini görebilirsiniz: C ve C ++ 'dan kaldırılan özellikler
Java, operatörün aşırı yüklenmesine izin vermediğinden bunu kendiniz yapamazsınız.
İle bir yandan istisna. + ve + = , String nesneleri için aşırı yüklenmiş.
&
, |
ve ^
için aşırı edilir boolean
ve ayrılmaz türleri. Ve gerçekten de, aritmetik ve ilişkisel operatörler çeşitli sayısal tipler için aşırı yüklenmiştir. (Elbette, aşırı yüklerin semantiği çok daha yakın ...)
Diğerlerinin yanıtladığı gibi: Java, kullanıcı tanımlı operatör aşırı yüklemesini desteklemez.
Belki konu dışı, ama bazı cevaplarda okuduğum bazı şeyler hakkında yorum yapmak istiyorum.
Okunabilirlik hakkında.
Karşılaştırmak:
Tekrar bak!
Hangisi daha okunabilir?
Kullanıcı tanımlı türlerin oluşturulmasına izin veren bir programlama dili, yerleşik türlerle (veya ilkel türlerle) aynı şekilde hareket etmelerine izin vermelidir.
Dolayısıyla Java, Genel Programlamanın temel prensibini ihlal eder:
Yerleşik türlerdeki nesneleri kullanıcı tanımlı türlerdeki nesnelerle değiştirebilmeliyiz.
(Merak ediyor olabilirsiniz: "Yerleşik nesneler" mi dedi? ". Evet, buraya bakın .)
Dize birleştirme hakkında:
Matematikçiler setlerdeki değişmeli işlemler için + sembolünü kullanırlar.
Bu yüzden a + b = b + a olduğundan emin olabiliriz.
Dize birleştirme (çoğu programlama dilinde) bu ortak matematiksel gösterime uymaz.
a := "hello"; b := "world"; c := (a + b = b + a);
veya Java'da:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
Ekstra:
Java eşitliğinde ve kimliğinde nasıl karışık olduğuna dikkat edin. == (eşitlik) sembolü:
a. İlkel tipler için eşitlik.
b. Kullanıcı tanımlı tipler için kimlik kontrolü, bu nedenle eşitlik için equals () işlevini kullanmaya mecburuz.
Ama ... Bunun operatör aşırı yüklenmesi ile ne ilgisi var?
Dil, kullanıcının aşırı yüklenmesine izin verirse eşitlik operatörüne uygun bir anlam verebilir.
==
, C ve C ++ gibi Java'da eşitlik için kullanılır. Bunun operatörün aşırı yüklenmesi ile ilgisi yoktur.
Java Operatörü Aşırı Yüklemeyi deneyebilirsiniz . Kendi sınırlamaları vardır, ancak operatör aşırı yüklemesini gerçekten kullanmak istiyorsanız denemeye değer.
Java kodunuzla birlikte Xtend'i kullanmanız yeterlidir. Operatör Aşırı Yüklemeyi destekler:
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
}
}
Resmi web sitesinde, her operatör için uygulanacak yöntemlerin bir listesi var!
Ya da Java Groovy yapabilir ve istediğinizi elde etmek için bu işlevleri aşırı yükleyebilirsiniz
//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
Kim harika olmak / kullanmak istemez ki? : D
Hayır, derlenmiş harika JAR'ları Java ile aynı şekilde kullanamazsınız. Hala Java için bir derleyici hatasıdır.
C ++ 'dan farklı olarak Java, kullanıcı tanımlı operatör aşırı yüklemesini desteklemez. Aşırı yükleme, dahili olarak java'da yapılır.
+
Örneğin (artı) şunları alabiliriz :
int a = 2 + 4;
string = "hello" + "world";
Burada, artı iki tam sayı ekler ve iki dizeyi birleştirir. Java'nın dahili operatör aşırı yüklemesini desteklediğini ancak kullanıcı tanımlı olmadığını desteklediğini söyleyebiliriz.