Generics

Status
Nicht offen für weitere Antworten.

tarzan

Mitglied
Hallo,

ich habe eine Klassen erstellt die Objekte eines bestimmten (aber festen) Typs aufnehmen soll, die mindestens Comparable sein müssen. Ich dachte mir, dass das Klassen-Template eigentlich so aussehen müsste.

Code:
public class Klasse<T extends Comparable<T>> {
...

   public void add(T a) {
      ...
   }
}

Als nächstes wollte ich eine Instanz erstellen wobei erst zur Laufzeit bekannt ist welchen Typ T nun hat. Das heißt es müssen Wildcards zum Einsatz kommen.



Code:
public void test() {

   Klasse<? extends Comparable<?>> a;

   if (Bedingung1)
      a = new Klasse<Integer>();
   else
      a = new Klasse<Float>();


   if (Bedingung1)
      a.add(new Integer(0));
   else
      a.add(new Float(0));
}

Bis zu dem Punkt an dem ich Objekte zu a hinzügen möchte gibt der Code Assistent von Eclipse keine Fehlermeldungen aus. Aber beim Hinzufügen gibt es die Methoden-Signatur in der Klasse angeblich nicht. Wie schreibt man das richtig hin? Ich schätze mal das Problem liegt bei den Wildcards oder? Ich muss wahrscheinlich dem Compiler irgendwie mitteilen, dass die beiden Fragezeichen vom selben Typ sein sollen oder?

Danke im Voraus
 
S

SlaterB

Gast
du kannst in a nur dann Integer oder Float einfügen, wenn a als TypParameter Integer oder Float angegeben hat,

mit ? ist fast nix angegeben, du und der Compiler wissen damit, dass in a Comparable Objekte drin sind,
beim get könnte man diese also auf Comparable casten,

zum Einfügen ist so ein Konstrukt aber nicht hilfreich,
das heißt, dass du gar nix einfügen kannst, weil keine Typsicherheit gewährleistet ist

oder wie sollte der Compiler

Klasse<? extends Comparable<?>> a;
+
a = new Klasse<Integer>();
+
a.add(new Float(0));

verhindern? Code analysieren?
 

tarzan

Mitglied
du kannst in a nur dann Integer oder Float einfügen, wenn a als TypParameter Integer oder Float angegeben hat,

Genau das mache (versuche) ich bei der Initialisierung .

das heißt, dass du gar nix einfügen kannst, weil keine Typsicherheit gewährleistet ist

Genau die will ich ja erreichen. Wenn a einmal initialisiert ist soll der Typ fest sein.

mit ? ist fast nix angegeben, du und der Compiler wissen damit, dass in a Comparable Objekte drin sind,

Ich weiß, meine frage war ja auch wie ich das nun erreichen kann (den Typ zur Laufzeit festzulegen).
 
S

SlaterB

Gast
z.B.

Klasse<? extends Comparable<?>> a;
Klasse<Integer> b;
Klasse<Float> c;


if (Bedingung1) {
b = new Klasse<Integer>();
a = b;
}else {
c = new Klasse<Float>();
a = c;
}

if (Bedingung1)
b.add(new Integer(0));
else
c.add(new Float(0));

aber nicht mit nur einer Variablen a
 

tarzan

Mitglied
Schade ich dachte es geht irgendwie eleganter. Jetzt muss ich für jeden Typ den selben Code schreiben. Danke dir
 

Marco13

Top Contributor
Vielleicht geht es eleganter. Evtl. würde es helfen, wenn du genauer beschreiben würdest, was in der Methode gemacht werden soll, die jetzt "test" heißt. Sowas hier würde zwar funktionieren, ist jetzt in bezug auf das Ziel natürlich... nur hingekrampft
Code:
public class Klasse<T extends Comparable<T>>
{

    public static void main(String args[])
    {
       Klasse<? extends Comparable<?>> a = new Klasse<Integer>();
       a.test();
    }


    public void add(T a)
    {
    }

    public void test()
    {
       Klasse<? extends Comparable<?>> a = null;

       if (true)
       {
           a = createAndAdd(new Integer(0));
       }
       else
       {
           a = createAndAdd(new Float(0));
       }
    }


    <Type extends Comparable<Type>> Klasse<Type> createAndAdd(Type element)
    {
        Klasse<Type> klasse = new Klasse<Type>();
        klasse.add(element);
        return klasse;
    }
}
 
S

SlaterB

Gast
wie habe ich es doch vor kurzem irgendwo so schön gelesen?:
ein Generischer Parameter sollte IMMER nur aus einem Großbuchstaben bestehen, damit er nicht mit einem echten Typ verwechselt wird ;)
 

tarzan

Mitglied
Wichtig für mich ist, dass die add-Methode von Klasse funktioniert. Ich will nachdem ich a initialisiert habe typsicher Objekte dazufügen können. Also derart:


Code:
public static void main(String args[]) 
{ 
       Klasse<? extends Comparable<?>> a = new Klasse<Integer>(); 
       a.add(new Integer(0));
       a.add(new Integer(1));
       a.add(new Float(4));   // Fehler!

}
 
S

SlaterB

Gast
du kannst add(new Integer(0)); ausschließlich an einem Objekt Klasse<Integer> sicher aufrufen,
einfache Regel
 

L-ectron-X

Gesperrter Benutzer
Noch am Rande:

Es sollte besser nicht new Integer() oder new Float() verwendet werden, weil das etwas mehr Speicher verbraucht und nicht ganz so performant ist.
Besser und richtig ist es, die jeweilige valueOf()-Methode der entsprechenden Wrapper-Klasse zu benutzen.
 

tarzan

Mitglied
@SlaterB Einleuchtend.

@L-ectron-B Weißt du ob Integer.valueOf() auch beim autoboxing zum Einsatz kommt?
 

Marco13

Top Contributor
SlaterB hat gesagt.:
wie habe ich es doch vor kurzem irgendwo so schön gelesen?:
ein Generischer Parameter sollte IMMER nur aus einem Großbuchstaben bestehen, damit er nicht mit einem echten Typ verwechselt wird ;)

War mir nicht bekannt. Weißt du noch, WO du das gelesen hast?
 

tarzan

Mitglied
@SlaterB

Habe einen Vector mit Integern gefüllt und bekomme gleiche Zeiten für Autoboxing, new Integer() und Integer.valueOf() (jeweils 1 s und rund 100 ms für 3.000.000 Werte)
 
S

SlaterB

Gast
naja, nicht gerade Zeiten messen,

ich meinte, Integer k = 1; mit Integer.valueOf(1) auf == zu testen,

Autoboxing verwendet jedenfalls valueOf, richtig
 

Marco13

Top Contributor
Hm. Das Argument leuchtet mir einerseits ein, andererseits finde ich, dass man Typparameter, die mit dem Suffix "...Type" aufhören, leicht als solche erkennt. Sowas wie

class MyContainer<E,L,S> { ... }

ist eben IMHO nicht so ... "sprechend" und selbsterklärend wie sowas wie

class MyContainer<ElementType,ListenerType,SourceType> { ... }

oder so... (Und schließlich hintert einen ja niemand dran, eine Klasse Names "E" zu erstellen :wink: ) Aber nachdem ich mal gewebsucht habe, und das mit den "Ein-Buchstaben-Parameternamen" auch auf http://java.sun.com/docs/books/tutorial/java/generics/gentypes.html steht, werde ich mich da vielleicht in Zukunft eher dran halten.
 
S

SlaterB

Gast
kommt ganz auf die jeweilige Benennung an, ich z.B. habe viele Enum-Klassen, die auf -Type enden

edit: in der Java-API anscheinend auch so:
java.lang.annotation.ElementType

oder auch Interface
java.lang.reflect.Type
;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben