Generic Bug?

TheWhiteShadow

Bekanntes Mitglied
Ich hab die Methoden keySet und values zu einer Feldvariablen(HashMap) delegiert.
Beim Zugriff von außen ging der Typ-Parameter flöten.

Beispiel:
Java:
class Klasse {
	private HashMap<String, Integer> map;

	public Set<String> keySet() {
		return map.keySet();
	}

	// ...
	for (String key : this.keySet()) // Kein Problem
}
// ...
Klasse klasse = new Klasse();
for (String key : klasse.keySet()) // Error: cannot convert from element type Object to String
Die von Eclipse angezeigte Methodensignatur bestätigt den Fehler. Außerhalb der Klasse ist der Typ weg.
Sieht für mich in erster Linie wie ein Bug aus.
 

TheWhiteShadow

Bekanntes Mitglied
Ok, habs mit meinem Minimalbeispiel noch mal getestet und gesehen, dass es bei mir auch geht.
Hab beim Kürzen das Typargument übersehen, was wohl eine Rolle spielt.

Die delegierende Klasse benötigt ein Typargument und muss in einer Raw-Variablen gehalten werden.
Allerdings ist die HashMap und die Delegate-Methode völlig unabhöngig vom Typ-Argument der Klasse selbst.

Korrektur:
Java:
class Klasse<E> {
	private HashMap<String, Integer> map;

	public Set<String> keySet() {
		return map.keySet();
	}

	// ...
	for (String key : this.keySet()) // Kein Problem
}
// ...
Klasse klasse = new Klasse<Object>();
for (String key : klasse.keySet()) // Error: cannot convert from element type Object to String

btw: (Eclipse Helios, JDK 1.6) (Eclipse Indigo, JDK 1.7)
 
S

Spacerat

Gast
Es läuft auch ohne Typargument
Java:
class Klasse {
	Map<String, Integer> map;

	public Set<String> keys() {
		return map.keySet();
	}
}

public class Test {
	public static void main(String[] args)
	{
		Klasse k = new Klasse();
		for(String s : k.keys()) {
			
		}
	}
}
 
G

Gast2

Gast
Brauchst du zwingend den Raw type?
Java:
Klasse<?> klasse = new Klasse<Object>();
So würde das gehen.
 

TheWhiteShadow

Bekanntes Mitglied
Ich weiß, dass es ohne Typargument läuft.
Ich habs ja noch mal nachgeprüft.

Dass das Beispiel ohne Typargument auskommt ist mir auch klar.
Aber mit Argument tritt der Bug auf und darum gehts mir.

Ich Weiß auch mitlerweile wie ichs umgehen Kann.

Trotzdem danke.
 

mvitz

Top Contributor
Also ich kann das mit folgendem Code auch unter diversen JDKs (1.5.0_22, 1.6.0_35 und 1.7.0_05) nachvollziehen:

Java:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public final class Test<T> {

    private final Map<String, Integer> map = new HashMap<String, Integer>();

    public Test() {
        map.put("Foo", 1); 
        map.put("Bar", 2); 
    }   

    public Set<String> keys() {
        return map.keySet();
    }   

    public static void main(String[] args) {
        final Test t = new Test<Object>();
        for (String s : t.keys()) {
            System.out.println(s);
        }   
    }   
}

Ändert man jedoch Zeile 19 nach:
Java:
final Test<Object> t = new Test<Object>();
funktioniert es.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
@faetzminator: Die Frage wollte ich auch grad' stellen.

@TheWhiteShadow: Wenn's bei dir nur mit Typearguments geht, dann liegt's wohl an deinem speziellen Code, also dem des realen Projekts. Ich würd' das aber nicht als Bug bezeichnen.
 
M

maki

Gast
...
Ändert man jedoch Zeile 19 nach:
Java:
final Test<Object> t = new Test<Object>();
funktioniert es.
Irgendwer hat in diesem forum mal einen Link zu einem Google tech talk gepostet, da wurde dieseer "Effekt" erläutert:
Die Klasse Test nimmt einem gen. Typen entgegen, nutzt ihn aber nicht, soweit, so gut.
Wenn man ihn aber weglässt, wirft der Compiler alle Generics über Bord und arbeitet munter ohne weiter...

Das ist kein Compiler Bug o.ä., liegt am Code, dieser sollte korrigiert werden.
 
S

Spacerat

Gast
@EikeB: Gut zu wissen... wo kann man das nachlesen? :rtfm:

Aber BTW.: Die Klasse des Eingangsposts war nicht typisiert.
 

FArt

Top Contributor
Ich schätze mal es handelt sich hier um einen Effekt im Zusammenhang mit "Type Erasure".
Typparameter werden durch die Klasse aus der Boundsklausel ersetzt. Wenn keine da ist, werden sie durch Object ersetzt.
 

TheWhiteShadow

Bekanntes Mitglied
Also verwirft der Kompiler bei einem Raw-Typ nicht nur meinen Typen sondern auch alle beinhaltenden Typen (Hier die, der HashMap und des Sets) ?

Also mach er auch aus
Code:
public Set<String> keySet()
->
Code:
public Set keySet()
.

Schau dir nochmals sein Beispiel aus dem ersten Post an... Typisiert hat er es nur, um den Fehler (?) zu beheben.
Jep, war falsch. Ist mir ausversehen beim Vereinfachen der Original-Klasse passiert.
Hab nicht gewusst, dass es am Typen der Klasse Klasse lag.^^
 

faetzminator

Gesperrter Benutzer
Das klärt einiges. Zusammenfassend kann man sagen: Wenn die Klasse gar nicht typisiert ist, kein Problem. Wenn die Klasse typisiert ist, man den Typen aber nicht kennt, sollte man [c]<?>[/c] o.ä. verwenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
Neumi5694 Datentypen Generic mit parameterlosem Konstructor Allgemeine Java-Themen 4
C Generic collections und static typing Allgemeine Java-Themen 4
K Generic class und Reflection Allgemeine Java-Themen 2
K Saubere Verwendung von Generic Types Allgemeine Java-Themen 7
T Generic Allgemeine Java-Themen 1
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
N Generic extends Generic Allgemeine Java-Themen 5
P Generic zur Laufzeit Allgemeine Java-Themen 4
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
S Reflection und Generic Allgemeine Java-Themen 9
G Klasse eines Generic Allgemeine Java-Themen 6
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
G Generic merhfach Angabe Allgemeine Java-Themen 8
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
N generic reflection Allgemeine Java-Themen 5
thE_29 Generic Methoden die sich aufrufen wollen nicht immer Allgemeine Java-Themen 12
A Generic-Problem. was meint ihr dazu? Allgemeine Java-Themen 4
G unbekanntes Generic Allgemeine Java-Themen 12
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
V ArrayList ist nicht generic!?? Oder bin ich blöd? Allgemeine Java-Themen 2
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben