Rechenoperationen auf generische Datentypen

Status
Nicht offen für weitere Antworten.

leifg

Mitglied
Hallo zusammen,

ich suche eine Möglichkeit, wie ich 2 Zahlen addieren/subtrahieren/multiplizieren/dividieren kann. Also genauer gesagt, alle Zahlen die von der Klasse Number erben. Durch Boxing/Unboxing ist seit Java 5 ja folgendes möglich:

Code:
Float add(Float a, Float b)
{
 return a+b;
}

Integer add(Integer a, Integer b)
{
 return a+b;
}
...

Bisschen viel Schreibarbeit für alle Datentypen.

Folgendes funktioniert leider nicht:

Code:
public class fAdd2 < T extends Number >
{

public T sum( T a, T b )
{
 return a+b;
}
}

Was ist die eleganteste Lösung dieses Problem zu lösen, sodass ich eine Methode add habe die mir alle Formen von Zahlen addiert und als entsprechenden Datentyp wieder zurück liefert?
 

happy_robot

Bekanntes Mitglied
ein wenig tippen scheint schon notwendig, da Number wieder auf die basistypen zurückgeht.

Code:
	public static<T extends Number> T add(T arg1, T arg2) {
		if(arg1 instanceof Integer) { return (T)new Integer(arg1.intValue()+arg2.intValue());	}
		if(arg1 instanceof Double) { return (T)new Double((double)arg1.doubleValue()+arg2.doubleValue());	}
		.....
	}

EDIT:

ausserdem würde ich persönlich von der nutzung der klassen-varianten der basis-typen abraten.
da kann man sehr seltsame effekt mit erzeugen die als bugs fast nicht zu finden sind.
 

Marco13

Top Contributor
Und ich würde davon abraten, 5 Zeilen mit Methoden für verschiedene Typen durch 10 Zeilen mit lauter 'instanceof's zu ersetzen..... :autsch:
 
M

maki

Gast
ch suche eine Möglichkeit, wie ich 2 Zahlen addieren/subtrahieren/multiplizieren/dividieren kann. Also genauer gesagt, alle Zahlen die von der Klasse Number erben.
Was stimmt denn nicht mit den standard Operatoren (+, -, /, *, %, ....)?

Falls das ein Beispiel sein sollte, finde ich es schlecht gewählt.
 

Marco13

Top Contributor
happy_robot hat gesagt.:
Marco13 hat gesagt.:
Und ich würde davon abraten, 5 Zeilen mit Methoden für verschiedene Typen durch 10 Zeilen mit lauter 'instanceof's zu ersetzen..... :autsch:
genau dieses hatte er per aufgabenstellung ausgeschlossen! :roll:
Hab ich auch nach erneutem Durchlesen nicht gefunden. Mein Beitrag bezog sich auch auf den ersten Lösungsvorschlag.
 

happy_robot

Bekanntes Mitglied
Marco13 hat gesagt.:
Hab ich auch nach erneutem Durchlesen nicht gefunden. Mein Beitrag bezog sich auch auf den ersten Lösungsvorschlag.
nun denn. wenn du bei obiger aufgabenstellung von meiner lösung abrätst solltest du vielleicht auch bessere alternativen aufzeigen können. ausserdem fehlt die begründung warum man das nicht machen sollte. das einzige was man anmeckern könnte ist das die methode wohl eine exception werfen sollte wenn sie für einen nicht unterstützten datentyp aufgerufen wird.

bin gespannt
 

Marco13

Top Contributor
Sowas wie
Code:
Float add(Float a, Float b)
{
    return a+b;
}

Integer add(Integer a, Integer b)
{
    return a+b;
}
ist (objektiv) besser als
Code:
public static<T extends Number> T add(T arg1, T arg2) 
{
      if(arg1 instanceof Integer) 
      { 
          return (T)new Integer(arg1.intValue()+arg2.intValue());   
      }
      if(arg1 instanceof Double) 
      { 
          return (T)new Double((double)arg1.doubleValue()+arg2.doubleValue());   
      }
}
weil die erste Lösung weniger Schreibarbeit ist (was ein Hauptgrund für die ursprüngliche Frage zu sein schien), und 'typsicherer" ist (d.h. ohne instanceof und potentielle Exceptions auskommt). Außerdem ist sie (subjektiv) besser lesbar und leichter verständlich.

Wenn du einen Grund nennen kannst, warum deine Lösung (objektiv) "besser" sein sollte, würde mich der auch interessieren.

Die Frage, warum nicht einfach die Standardoperatoren verwendet werden, ist aber nach wie vor ungeklärt.
 

happy_robot

Bekanntes Mitglied
Marco13 hat gesagt.:
weil die erste Lösung weniger Schreibarbeit ist (was ein Hauptgrund für die ursprüngliche Frage zu sein schien), und 'typsicherer" ist (d.h. ohne instanceof und potentielle Exceptions auskommt). Außerdem ist sie (subjektiv) besser lesbar und leichter verständlich.
ich würde die andere variante auch vorziehen. alle anderen punkte sind aber durchaus streitbar. wenn ich zum beispiel alle additionen loggen will ist die generic-variante sicherlich weniger schreibaufwendig und nicht redundant. dadurch würde es dann auch besser lesbar (da nur 1x vorhanden). die frage des besseren verständnisses kann ich hier leider nicht beantworten.
mein vorschlag sollte auch nur ein vorschlag sein. bislang gibt es aber scheinbar keinerlei alternativen und alle anderen vorschläge zielen an der aufgabenstellung vorbei (ob sie hierbei sinn macht oder nicht ist doch auch egal).

Marco13 hat gesagt.:
Wenn du einen Grund nennen kannst, warum deine Lösung (objektiv) "besser" sein sollte, würde mich der auch interessieren.
sie ist weder besser noch ansatzweise gut. allerdings entspricht sie seinen anforderungen. ob die anforderungen dabei sinnvoll sind interessiert imho auch nicht.

Marco13 hat gesagt.:
Die Frage, warum nicht einfach die Standardoperatoren verwendet werden, ist aber nach wie vor ungeklärt.
diese variante garantiert ihm daß er immer additionen gleichen typs durchführt und sich nicht vielleicht die addition eines int + double oder so einschleicht. daher ist es vielleicht für seinen anwendungsfall typsicherer als das nutzen der standardoperatoren. ich kenne den "anwendungsfall" aber nicht.
 
B

Beni

Gast
Die Lösung mit mehreren Methoden funktioniert nicht, wenn man die Typen in der aufrufenden Methode nicht zur Kompilierzeit kennt.

Ich bin ja bekannt für meine komplizierten Lösungen... deshalb mal meine Inspiration:

Ein bisschen Vorbereiten
Code:
interface Operators<N>{
  N add( N a, N b );
  ...
}

class DoubleOperators extends Operators<Double>{
  public Double add( Double a, Double b ){
    return a + b;
  }
  ...
}

Der Algorithmus den man tatsächlich schreiben will
Code:
public <N> N doSomething( N a, N b, N c, Operators<N> ops ){
  return ops.mul( ops.add( a, b ), c );
}

Und so wird der Algorithmus aufgerufen:
Code:
doSomething( 1.0, 2.0, 3.0, new DoubleOperators() );
 

happy_robot

Bekanntes Mitglied
Beni hat gesagt.:
Ich bin ja bekannt für meine komplizierten Lösungen... deshalb mal meine Inspiration:
sei mir nicht böse, aber da ziehe ich die unschöne instanceof-variante immer noch klar vor. :D
diese lösung schaut zwar schlau aus, ist aber imho weder transparent noch performant.

wie auch immer, die etwas aufwendigere "klassische" version von Marco13 ist sicherlich die wohl sinvollste und wohl auch die die hier jeder vorziehen würde.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
D Methode für generische enummap/enum Allgemeine Java-Themen 10
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
H generische Klasse Realtion Allgemeine Java-Themen 2
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
B Generische Typen instanzieren Allgemeine Java-Themen 11
R Generische Listener und Sender Allgemeine Java-Themen 12
M Generische Datentypen Allgemeine Java-Themen 14
S Generische Liste Allgemeine Java-Themen 30
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
B Abstrakte Datentypen synchronisieren Allgemeine Java-Themen 11
M Technische Realisierung von Atomic Datentypen Allgemeine Java-Themen 16
D JNA Speicherbelegung der Datentypen Allgemeine Java-Themen 13
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
W Primitive Datentypen - Klassenpfad auflösen? Allgemeine Java-Themen 6
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Datentypen Kopieren von Datentypen Allgemeine Java-Themen 10
Asphorm Datentypen Datentypen werden nicht ordnungsgemäß umgewandelt Allgemeine Java-Themen 1
J Datentypen in Java Tabelle Allgemeine Java-Themen 2
B Chat auf andere Datentypen aufteilen Allgemeine Java-Themen 2
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
O primitive Datentypen threadsicher? Allgemeine Java-Themen 13
B Sortieren mit generischen Datentypen Allgemeine Java-Themen 3
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
I Probleme mit Datentypen Allgemeine Java-Themen 4
D Addition generischer Datentypen Allgemeine Java-Themen 12
C Primitive Datentypen in Threads Allgemeine Java-Themen 4
E Quelltext nach Datentypen durchsuchen Allgemeine Java-Themen 10
the[V]oid Primitive Datentypen Wrappen und als primitiv markieren? Allgemeine Java-Themen 7
B Eigene Datentypen Allgemeine Java-Themen 5
H Linksschieben << bei long-Datentypen Allgemeine Java-Themen 2
R Problem mit Datentypen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben