Operatorenüberladung?

Status
Nicht offen für weitere Antworten.

Chrisi3210

Aktives Mitglied
Hallo !

Ist es bereits möglich, in Java operatoren zu überladen?

Hier z.B. die Methoder

public <T> max(<T> a,<T>b){

if (a<b) return b;
return a;
}
Gibt es dafür eine möglichkeit oder geht das nur im
Stile

public boolean cmp(real a,real b)
public boolean cmp(sting a,string b)

public <T> max(<T> a,<T>b){

if (cmp(a,b)) return b;
return a;
}
???
 

Chrisi3210

Aktives Mitglied
Danke für den Hinweis! Aber mir geht es nicht um den Vergleich, sondern um die generische Programmierung.
Deswegen nützt mir der Verweis auf diesen Artikel nicht all so viel.

Genauso kann ich auch folgendenes definieren

public class test<T>{

public T hypot(T a, T b){
return sqrt(a*a+b*b);
}
}

In diesen Fall müsste die Wurzelfunktion, die Addition und die Multiplikation
auf verschiedene Datentypen zugeschnitten sein.
Wie kann dass bewerkstelligt werden kann.
Müssen hierzu z.B. die Methoden Add und Mult definiert werden, oder gibt es eine Möglichkeit, wie
in C++, dass so umzumünzen, dass man auch für andere Datentypen "+" oder " * " verwenden kann.
 

Civilazi

Bekanntes Mitglied
Das geht so nicht, du kannst aber natürlich mult, add, was weiß ich Methoden schreiben. Die musst du dann aber auch aufrufen, nicht mit *, +, etc.
 

Templon

Bekanntes Mitglied
Ne Operatoren überladen kannst du nicht.

=)

Und wenn du doch etwas generisches möchtest, musst du dir irgend so etwas bauen:

[Java]
interface Addable<T> {
T add(T y);
}

class MyAddableClass implements Addable<MyAddableClass> {

@Override
public MyAddableClass add(MyAddableClass theOther) {

// Add logic here

return null;
}
}

public class OperatorTest {

public <T extends Addable<T>> T add(T a, T b) {
return a.add(b);
}

public static void main(String[] args) {
MyAddableClass addableClass = new MyAddableClass();
OperatorTest test = new OperatorTest();

test.add(addableClass, addableClass);
}
}
[/code]

Geht vllt auch irgendwie besser und ist nicht getestet =)
 

Templon

Bekanntes Mitglied
=)

Und wenn du doch etwas generisches möchtest, musst du dir irgend so etwas bauen:

[Java]
interface Addable<T> {
T add(T y);
}

class MyAddableClass implements Addable<MyAddableClass> {

@Override
public MyAddableClass add(MyAddableClass theOther) {

// Add logic here

return null;
}
}

public class OperatorTest {

public <T extends Addable<T>> T add(T a, T b) {
return a.add(b);
}

public static void main(String[] args) {
MyAddableClass addableClass = new MyAddableClass();
OperatorTest test = new OperatorTest();

test.add(addableClass, addableClass);
}
}
[/code]

Geht vllt auch irgendwie besser und ist nicht getestet =)

ich verweise auf Landeis Signatur :)

"oder nehm Scala"

Oder C++ oder C# ^^

EDIT: Oh sry für doppelpost :S
 

Chrisi3210

Aktives Mitglied
Mir ist eine bessere Idee gekommen:

Wie wär es mit ?:

abstract class Ttest <T> {
abstract T add(T a, T b);
abstract T mult(T a, T B);
abstract T sqrt( T a);

public T hypot(T a, T b){
return sqrt(add(mult(a,a),mult(b,b));
}
}
}
 

Marco13

Top Contributor
In einen anderen/ähnlichen Thread hatte ich schonmal drüber philosophiert, inwieweit Operatorenüberladung sinnvoll sein kann: http://www.java-forum.org/allgemeine-java-themen/66372-nachteile-von-java-3.html#post409257 bzw http://www.java-forum.org/allgemeine-java-themen/66372-nachteile-von-java-4.html#post411088

Zusammenfassend: Ich finde, dass man, wenn man Operatoren überladen kann und das auch tut, zusichern sollte, dass die damit geschaffenen Strukturen "algebraisch sauber" sind - sie also die Interfaces erfüllen, die es bei org.jscience.mathematics.structure (JScience v4.3 API) z.B. schon andeutungsweise gibt.
 
Status
Nicht offen für weitere Antworten.

Oben