genericsdeklaration - Typen einschränken

T

trez

Gast
Hallo.

Ist es Möglich die Auswahl möglicher Typen bei Genericsdeklarationen einzuschränken?

Zum Beispiel dass ich nur Zahlen (Numbers) einfügen kann die Comparable sind?

Der naive Versuch
Java:
public class DataSet<T extends Number implements comparable > {}
geht leider nicht -> Syntax error on token "implements", , expected

Aktuell reicht mir sogar Comparable - ich möchte in der Klasse die < > Operatoren anwenden können.
 
T

trez

Gast
T extends Number, Comparable
sollte eigentlich gehen

Leider nein ...

Java:
public class DataSet<T extends Number, comparable> {
	private T max;

	public void add (T value) {
		if(value>max) // The operator > is undefined for the argument type(s) T, T
			this.max = value;
	}
}

So nebenbei die Notation mit ? ist mir total suspekt ;-)
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
Comparable schreibt man groß

und für größer/kleiner Vergleiche von Objekten kannst du die compareTo nehmen. Deshalb macht es vermutlich auch Sinn, dass Comparable implementiert sein muss ;)
 
T

trez

Gast
Ich möchte, dass meine Klasse nur mit Integer, Long, Float und ähnlichem instanziert (sagt man dem so) werden kann.

Die haben alle etwas gemeinsames - sie sind von Number abgeleitet und erweitern Comparable

Im Moment habe ich allerdings erst die Vergleiche vor, also würde mir
Java:
class <T implements Comparable> {}

reichen, aber das geht ja leider nicht.

übrigens: wEr tipPfähler findet, darf die gerne Behalten - Eclipse korrigiert mir die dann schon :D


compareTo tönt ja gut, aber wenn oben nur "T" steht, gibt es keine compareTo ;(

Ok Erkenntnis 1: < ist nicht in Comparable ....
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
compareTo tönt ja gut, aber wenn oben nur "T" steht, gibt es keine compareTo ;(

was meinst du denn, was Comparable erzwingt?

Java:
public class DataSet<T extends Comparable<T>> {
    
	private T max;
	
    public void add(T value) {
        if(value.compareTo(max) > 0)
            this.max = value;
    }
}
 
T

trez

Gast
Warst zwar einige Sekunden langsamer aber trotzdem Danke ;-)

So nebenbei - das letzte mal intensiv programmiert habe ich so vor knapp 10 Jahren in C und seither nur noch reviewed und notfalls getestet - aber wenn wichtige Leute länger in Urlaub gehen und andere krank sind .... ;-)
 
T

trez

Gast
Sorry, war kurz an einer Sitzung und etwas vorschnell mit Lob :)

Das Folgende gibt eine null pointer Exception. this.max ist null

Java:
public class DataSet<T extends Comparable<T>> {
	private T max;
	public void add (T pValue) {
		if (pValue.compareTo(max)>0)
			max = pValue;
	}
}


und das geht auch nicht ...

Java:
public class DataSet<T extends Number, Comparable<T>> {

- Syntax error on token ",", . expected
- The type parameter Comparable is hiding the type Comparable<T>
 

nrg

Top Contributor
Zum zweiten Problem:

z.B.:
Java:
public class DataSet<T extends Number & Comparable<T>> {
    
	private T max;
	
	public void add(T pValue) {
        if (max == null || pValue.compareTo(max) > 0)
            max = pValue;
    }
}

edit beachten. ist vermutlich so schöner gelöst
 
Zuletzt bearbeitet:
T

trez

Gast
Guten Morgen.

naja. du brauchst halt noch einen Konstruktor oder eine Setter, die/der max initialisiert

Hm hm - da springt mir aber deine Signatur förmlich ins Auge ;-)

max= new T() geht natürlich nicht! T ist ja nur ein Interface (Comparable)
bzw im Fall von Number & ... abstrakt.

Also bleibt nur, das von aussen zu setzen, aber wenn ich das in der add Methode mache wird ja nur die Objektreferenz des Parameters kopiert und das ist natürlich nicht die Meinung, da sich max sonst z.b. wie ein Schlaufenindex verhalten könnte.

Beim Aufruf add(new Integer(i)) zu schreiben ist irgendwie suboptimal

Setzen über Konstruktor? Aber wie ich in der Add Methode dafür sorge dass der Inhalt und nicht die Referenz kopiert wird ist mir unklar.

Ideen?
 
T

trez

Gast
Ich versteh java nicht mehr

Java:
Integer ii = new Integer(1);
Integer j = ii;
System.out.println("i = " + ii + ", j = " + j);
ii = 2;
System.out.println("i = " + ii + ", j = " + j);
liefert
i = 1, j = 1
i = 2, j = 1

Ich weiss, viele sind zufrieden wenns läuft, aber ich muss immer wissen warum :)

Warum wird bei der Zuweisung ganz offensichtlich ein neues Objekt angelegt?
 

Marco13

Top Contributor
Joa, so grob.
ii = 2;
bedeutet ungefähr so viel wie
ii = Integer.valueOf(2);
oder auch
ii = new Integer(2);

Einigermaßen passendes Stichwort wäre "Autoboxing"
 
T

trez

Gast
Gibt es eine verbindliche Aussage bei welchen Klassen das so gemacht wird und bei welchen nicht?
 

nrg

Top Contributor
habe dir doch für dein erstes Problem auch ein Beispiel geschrieben.

Du prüfst in der add einfach ab, ob max null ist und wenn ja initialisierst du max mit pValue. Ansonsten prüfst du halt, ob pValue größer ist (siehe meinen letzten Beispielcode).

edit: zu deinem letzten Post: bei allen Wrappern von primitiven Datentypen (Integer, Double etc)
 
Zuletzt bearbeitet:
T

trez

Gast
Ich bin fälschlicherweise davon ausgegangen dass die Referenz kopiert würde, wie das ja meistens üblich ist, und das ginge natürlich daneben.
Das unterschiedliche Verhalten des = Operators zu überblicken ist nicht ganz einfach, wenn man von C kommt ;-)

Danke für die Hilfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
O Generische Typen Java Basics - Anfänger-Themen 9
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
BadBat Variablen Eine Variable mit 2 Typen Java Basics - Anfänger-Themen 38
D Generische Typen Java Basics - Anfänger-Themen 20
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
T Interface implementieren mit Abstrakten Typen? Java Basics - Anfänger-Themen 4
K Datentypen Kurzform Addition geht, Langform scheitert am Typen Java Basics - Anfänger-Themen 6
K Frage zu Referenzvariablen und deren Typen Java Basics - Anfänger-Themen 6
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
D Klassen Feste und veränderbare Typen in Hierarchien Java Basics - Anfänger-Themen 5
B Elementare Typen und Referenztypen Java Basics - Anfänger-Themen 6
S Collections Aus Set<Object> bestimmte Typen entfernen Java Basics - Anfänger-Themen 3
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
H Felder mit unterschiedl. Typen sortieren Java Basics - Anfänger-Themen 5
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
alderwaran überladene methoden mit allen möglichen typen aufrufen Java Basics - Anfänger-Themen 3
F Datentypen Zuweisungsproblem bei parametrisierten Typen mit/ohne Wildcards Java Basics - Anfänger-Themen 3
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
D Datentypen mehrdimensionales Array meherer Typen möglich ? Java Basics - Anfänger-Themen 6
R Array eines neuen Typen erstellen und befüllen Java Basics - Anfänger-Themen 2
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
T mit Typen Date rechnen Java Basics - Anfänger-Themen 6
G Mehrere Typen in einer Datei Java Basics - Anfänger-Themen 5
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
M List mit typen füllen Java Basics - Anfänger-Themen 5
J Datei aus unterschiedlichen Typen auslesen Java Basics - Anfänger-Themen 6
G Problem mit Variablen-Typen Java Basics - Anfänger-Themen 3
L 2 verschiedene Typen in einer Tabelle ablegen Java Basics - Anfänger-Themen 18
W Typen Angaben bei Java 1.5 Java Basics - Anfänger-Themen 8
T Rückgabewerte verschiedener Typen Java Basics - Anfänger-Themen 3
A Array mit generischen Typen casten? Java Basics - Anfänger-Themen 6
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3
O Lambda Ausdruck mit Wildcard einschränken Java Basics - Anfänger-Themen 5
J Eingabe Einschränken Java Basics - Anfänger-Themen 1
S createRandomColor einschränken Java Basics - Anfänger-Themen 5
S Zugriff auf Klasse/Methoden außerhalb eines Projektordners einschränken Java Basics - Anfänger-Themen 5
R Benutzerzugriff nur auf eine Website einschränken Java Basics - Anfänger-Themen 9
F Signifikante Stellen einschränken Java Basics - Anfänger-Themen 9
S Parameter einschränken Java Basics - Anfänger-Themen 19
G Array einschränken Java Basics - Anfänger-Themen 10
T Wertebereich auf 0 bis 1 einschränken Java Basics - Anfänger-Themen 10
O Iterator - Durchlauf "einschränken" bzw. steuern&q Java Basics - Anfänger-Themen 2
G String auf A bis Z und a bis z einschränken Java Basics - Anfänger-Themen 6
R resizen eines NULL-Layouts einschränken Java Basics - Anfänger-Themen 4
G Itemlistener einschränken Java Basics - Anfänger-Themen 2
M Quellcode einschränken?! Java Basics - Anfänger-Themen 6
G Eingabe einschränken Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben