Datentypen Generische Collections und Warnings

Die4Me

Mitglied
Hey,
ich bin gerade ein bisschen verwirrt. Ich habe vor eine generische Collection zu bauen und bin dort auf eine Sach gestoßen, welche ich nicht so wirklich kapiere. Wenn ich mir die ArrayList, den Vector oder die HashMap anschaue, dann werden die Elemente in einem Object-Array, bzw Entry-Array gehalten, welches ja nicht generisch ist. Fragt man dann die Elemente ab, wird gecastet und es kommt mit dem richtigen Typen raus. So wie alles sein sollte. Programmiere ich nun ähnlich, bekomme ich eine Warnung. "Unchecked cast from Object to E". Ich hänge mal kurz ein kleines Bsp ran.
Java:
public class MeineCollection< E > {

	private Object[] elementData;
	
	private int count;

	public MeineCollection() {
		elementData = new Object[ 10 ];
		count = 0;
	}
	
	public boolean add( E value ) {
		elementData[ count++ ] = value;
		return true;
	}

	public E get( int index ) {
		return ( E ) elementData[ index ];
	}

}
Das ist ja so im Grunde genommen das gleiche, was bei den genannten Collections auch passiert.
Warum bekomme ich dort eine Warnung? Kann man diese umgehen (nicht unterdrücken)? Und wenn ja wie? Oder ist diese Warnung wirklich nur mit @SuppressWarnings( "unchecked" ) zu "beheben"?
Ich weiß, dass man sich auch ein generisches Array mit
Java:
( E[] ) Array.newInstance( componentType, size );
erstellen kann. Aber das muss ich ja auch wieder mit @SuppressWarnings( "unchecked" ) unterdrücken.
Ich bin in dem Sinne gerade echt verwirrt und würde mich freuen, wenn ihr mir helfen könntet ein bisschen Licht ins dunkel zu bringen ^^

mfg
die4me
 

Wortraum

Bekanntes Mitglied
Das ist in Ordnung und richtig so, wie Du es machst, aber leider kann man die Warnung lediglich unterdrücken.

Der Übersetzer geht in Zeile 18 sturr davon aus, daß sich in elementData irgendwelche Objekte wie String oder Data befinden, und die dürfte man selbstverständlich nicht einfach in E umwandeln. Du als Klassenentwickler weißt an dieser Stelle mehr, nämlich daß ausschließlich Objekte vom Typ E in elementData gespeichert werden können, denn alles andere verbietet die Schnittstelle add(E value).

> Aber das muss ich ja auch wieder mit @SuppressWarnings( "unchecked" ) unterdrücken.
Beim Übersetzen werden die Typinformationen gelöscht, E ist nicht mehr bekannt. Der Übersetzer kann daher nie prüfen, ob die Typen richtig sind, und darauf möchte er Dich hinweisen. Da die Informationen nicht zur Verfügung stehen, kannst Du das aber auch nicht prüfen – es geht nur, indem man die Warnung unterdrückt.

AngelikaLanger.com - Java Generics - Type Erasure and Raw Types - Angelika Langer Training/Consulting
 
Zuletzt bearbeitet:

Die4Me

Mitglied
Gut. Das ich mehr weiß ist schön und so langsam steig ich auch dahinter. Außerdem sind Warnungen ja keine Fehler und man muss das nur ein bisschen absichern.
Ich hab nun mal ein bisschen im Quellcode von Java rum geschnüffelt. Ich nehme mal einen Auszug aus der ArrayList, wie es dort steht. Da dort nen Copyright steht, mach ich das nun mal nicht. Aber bei jedem SDK sind ja auch die Sourcen dabei und man kann mal schnell rein schauen. Wie machen das die Java Entwickler? Nehmen diese die Warnungen in kauf, oder übersetzten die mit
Code:
javac -Xlint:-unchecked
Denn ich habe dort im Quellcode kein @SuppressWarnings( "unchecked" ) gefunden.
Auch wenn sich das nun naiv anhört, aber ich mag keine Warnungen! :D
mfg
die4me

[Edit]
Des weiteren habe ich eine Klasse, welche Generische Typen enthält. Wie bilde ich nun daraus ein Array?
[Java]public class MeineCollection< E > {

private Entry<E>[] elementData;

public MeineCollection() {
elementData = new Entry[ 10 ];
}

}[/Java]Lasse ich bei der Deklaration den Typ-Parameter weg, oder initialisiere ich und Caste dann mit Typparameter oder wie macht man das am besten konform? Oder habe ich wirklich nur ein Object und Caste dann jeweils beim get so wie ich das ja in dem Beispiel davor gemacht habe?
 
Zuletzt bearbeitet:

Die4Me

Mitglied
Was mir nun auch mal aufgefallen ist nachdem ich den Artikel ein bisschen sacken lassen hab. Folgendes Beispiel..
[Java]public class Beispiel< E > {

private E[] meinArray;

public Beispiel( Class< E > componentType, int length ) {
this.meinArray = ( E[] ) Array.newInstance( componentType, buffersize );
}

}[/Java]Durch Class< E > ist doch eigentlich auch gesichert, dass kein anderes Class-Objekt übergeben werden kann, wie ich möchte. Jedoch bekomme ich dort auch eine Warnung.
[Java]public static main( String[] args ) {
Beispiel< Integer > bsp1 = new Beispiel< Integer >( String.class, 10 ); // Schlägt fehl
Beispiel< Integer > bsp2 = new Beispiel< Integer >( Integer.class, 10 ); // Das geht dann
}[/Java]Dort ist doch gesichert, dass nur ein Class< Integer > übergeben werden kann, oder übersehe ich dort was?
 
Zuletzt bearbeitet:

kirax

Bekanntes Mitglied
Die Typinformationen werden beim Compilieren gelöscht - deshalb warnt der Compiler davor.
Bei Generics kann man nicht alle Warnungen beseitigen, einige "muss" man unterdrücken.

Zum Warnungen unterdrücken:
Immer so kleine Bereiche wie möglich unterdrücken. Am besten immer nur die Zeile selbst (ggf. die Zeile in eine Hilfsmethode auslagern und die Warnung in dieser Hilfsmethode unterdrücken). Denn es gibt Warnungen, die man beheben kann und sollte, und beim Unterdrücken über einem großen Bereich übersieht man diese evtl.

Noch ein paar generelle Tipps zum Thema Generics und warum man z.B. auch keine Arrays von Generics erstellen kann:
http://java.sun.com/docs/books/effective/generics.pdf
 

Die4Me

Mitglied
Danke an euch beide für eure konstruktiven Beiträge. Der erste Link von Wortraum hat mir schon mal sehr gut gefallen und ich denke auf der Seite gibt es noch mehr lesenswertes zu Generics und vielen anderen Sachen.
Zu dieser Sache muss ich ganz ehrlich sagen, dass ich mir das auf Garantie auch noch mal zu Gemüt führe. Jedoch sind 36 Seiten erst ein mal ganz schön viel um mal schnell drüber zu schauen.
Aber es ist gespeichert und ich werde es mit garantiert noch mal anschauen.
Um nun aber zu einem Ende zu kommen und mal einen Weg zu Zeigen wie ich mir das nun mal gedacht habe. (In Anlehnung an)
Immer so kleine Bereiche wie möglich unterdrücken. Am besten immer nur die Zeile selbst (ggf. die Zeile in eine Hilfsmethode auslagern und die Warnung in dieser Hilfsmethode unterdrücken). Denn es gibt Warnungen, die man beheben kann und sollte, und beim Unterdrücken über einem großen Bereich übersieht man diese evtl.
Dort habe ich mir nun folgendes gedacht..
Java:
public class ObjectExtentions {

	private ObjectExtentions() {
	}

	@SuppressWarnings("unchecked")
	public static < E > E castTo( Object o ) {
		return ( E ) o;
	}

}
Java:
import static ObjectExtentions.castTo;
public class Beispiel< E > {
 
    private E[] meinArray;
 
    public Beispiel( Class< E > componentType, int length ) {
        this.meinArray = castTo( Array.newInstance( componentType, buffersize ) );
    }
 
}
Somit wird ja dann in einem kleinen Block dieser Cast durchgeführt. Ich habe den Vorteil, das ich nicht andauernd dieses unchecked unterdrücken muss und es ist trotzdem noch dynamisch um es auch an anderen Stellen einzusetzen. Ich hoffe mal, das die Einheit wo es zu einem falschen Cast kommen könnte so weit wie möglich runter gebrochen habe. Sollte ich dort irgendwas falsch machen oder dies ist zu unsicher, sinnlos, oder was auch immer... Dann schreibt mir bitte. Aber wie gesagt, ich möchte nicht über jede dritte Methode ein SupressWarnings( "unchecked" ) drüber schreiben.
Also, danke noch mal an euch beide.

mfg
die4me
 

Die4Me

Mitglied
Eigentlich hab ich das ja schon und ich hab sogar schon angefangen das zu lesen. Aber nun werde ich mich mal wirklich dahinter setzen. Naja... Ein bisschen Spaß muss ja sein.
Aber wie ich oben schon mal geschrieben habe, ist das nun eine Lösung, welche mir eben mal so in den Sinn gekommen ist und ich wollte diese mit euch teilen. Wenn die Lösung falscher als Falsch ist, dann werde ich das auch gleich wieder raus nehmen. Denn es ist ja nicht von Vorteil falsche Sachen zu sehen...
Also, ich würde es dann nun erst einmal abhacken und mich dann mal weiterhin mit dem PDF beschäftigen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Generische Collections und Vererbung Java Basics - Anfänger-Themen 2
I Generische Funktion Java Basics - Anfänger-Themen 3
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
D Generische Klasse Java Basics - Anfänger-Themen 6
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
O Generische Typen Java Basics - Anfänger-Themen 9
M Generische Klassen "FlaschenRegal" Java Basics - Anfänger-Themen 13
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
J Sortierte generische Liste Java Basics - Anfänger-Themen 1
D statische generische Methoden Java Basics - Anfänger-Themen 3
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
M Methoden Generische Klasse - ändern einzelner Attributwerte Java Basics - Anfänger-Themen 2
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
N Generische Schnittstellen Java Basics - Anfänger-Themen 2
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
D Generische Typen Java Basics - Anfänger-Themen 20
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
L Generische Liste Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
A Probleme mit MergeSort Generische Liste Java Basics - Anfänger-Themen 0
A Generische Methode Java Basics - Anfänger-Themen 4
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
J Probleme mit static generische Klasse Java Basics - Anfänger-Themen 6
M Generische Liste Java Basics - Anfänger-Themen 4
B Generische Methode Java Basics - Anfänger-Themen 2
B Generische Klasse Java Basics - Anfänger-Themen 7
B Generische Methoden Java Basics - Anfänger-Themen 8
F Collections Generische Klasse/Methoden Java Basics - Anfänger-Themen 19
L Generische Warteschlange Java Basics - Anfänger-Themen 8
A Generische Datentypen Java Basics - Anfänger-Themen 8
bluerob generische ArrayList -> erbende Objekte auslesen Java Basics - Anfänger-Themen 24
L Generische Containerklasse Java Basics - Anfänger-Themen 9
V Methoden Umwandlung in generische Methode Java Basics - Anfänger-Themen 8
S Generische HashMap Java Basics - Anfänger-Themen 2
M Klassen Generische Klassen, Personen und Gruppen Java Basics - Anfänger-Themen 6
L Generische ArrayList, CastProblem Java Basics - Anfänger-Themen 2
W generische Module Java Basics - Anfänger-Themen 2
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
F Generische Methoden Problem Java Basics - Anfänger-Themen 5
E Generische Arrays durch Typecast mit Object-Array Java Basics - Anfänger-Themen 11
K Generische Klasse mit innerer Klasse | Problem mit Array Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
B Generische Vererbung was ist der Unterschied? Java Basics - Anfänger-Themen 4
W Generische Klassen Java Basics - Anfänger-Themen 3
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
J array über generische arraylist Java Basics - Anfänger-Themen 7
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
N 2 dimensionale generische Arrays Java Basics - Anfänger-Themen 9
H Statische generische Methode Java Basics - Anfänger-Themen 2
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
0x7F800000 generische arrays mal wieder )-; Java Basics - Anfänger-Themen 6
D generische methode <T> void . Java Basics - Anfänger-Themen 9
J Generische Methoden Java Basics - Anfänger-Themen 6
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
S Parameterübergabe: Generische Klasse Java Basics - Anfänger-Themen 4
S generische Felder Java Basics - Anfänger-Themen 2
P Generische Klasse Java Basics - Anfänger-Themen 8
C Generische Klassen, das erste Mal. Java Basics - Anfänger-Themen 8
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
F Generische Liste von generischen Objekten. Java Basics - Anfänger-Themen 3
H generische Methoden Java Basics - Anfänger-Themen 5
N generische HashMap und Iterator Java Basics - Anfänger-Themen 2
H generische Bausteine, heterogene Datenstrukturen Java Basics - Anfänger-Themen 2
J generische klassen neue Instanz Java Basics - Anfänger-Themen 5
H Generische Klassen. Java Basics - Anfänger-Themen 16
U Sortierung in collections testen Java Basics - Anfänger-Themen 11
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
I Collections.shuffle funktioniert nicht Java Basics - Anfänger-Themen 1
M Collections Frage Java Basics - Anfänger-Themen 1
D Methoden Collections.shuffle mit bestimmtem Startwert? Java Basics - Anfänger-Themen 8
T Java Collections Java Basics - Anfänger-Themen 58
X Collections Collections Maps Frage Java Basics - Anfänger-Themen 4
C Collections: private Map Java Basics - Anfänger-Themen 4
V Collections Java Basics - Anfänger-Themen 3
A Collections Java Basics - Anfänger-Themen 2
P collections.sort Java Basics - Anfänger-Themen 2
R Iterationsreihenfolge über Collections Java Basics - Anfänger-Themen 4
S Klassen Collections Java Basics - Anfänger-Themen 10
J Polymorphie Iteratoren statt Collections Java Basics - Anfänger-Themen 13
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
S Bestimmte Objekte aus Collections anwählen/herausbekommen Java Basics - Anfänger-Themen 8
M Collections mit >2 type Parametern? Java Basics - Anfänger-Themen 8
S Frage zu Collections.frequency() Java Basics - Anfänger-Themen 3
T Collections Übersicht Collections Java Basics - Anfänger-Themen 4
X Collections Inhalt von zwei Collections prüfen Java Basics - Anfänger-Themen 4
K Telefonbuch Implementation mit Java Collections Java Basics - Anfänger-Themen 4
G Collections.binarySearch(LinkedList): cannot find method Java Basics - Anfänger-Themen 6
S Collections Sortieren von 3 Collections nach "einer Sortierung" Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben