2012-06-28 6 views
5

Dies ist wahrscheinlich ein einfaches Missverständnis meinerseits.Eine HashMap <String, String> kann nicht in eine Schnittstelle umgewandelt werden. Extending Map <String, String>

Haben Sie eine einfache Schnittstelle:

public interface IParams extends Map<String,String> { 
} 

Dann benutze ich versuchen:

IParams params = (IParams) new HashMap<String,String>(); 

Syntax Pässe und kompilieren, aber zur Laufzeit i erhalten:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams 

Einsicht in denen Mein Missverständnis von Generika ist in diesem Fall?

+5

Sie ist nicht Generika Missverständnis, sind Missverständnisse Sie die Vererbung . – Marcelo

+0

Irgendwelche Gründe, Karte zu erweitern? Überschreiben Sie irgendwelche Methoden? – kosa

+0

Die Absicht ist es, eine Schnittstelle zu erstellen, die die Generics verbirgt und auch (nicht im Beispiel gezeigt) die Schlüsseldefinitionen der Map-Schlüssel enthält. –

Antwort

10

HashMap nicht implementiert Ihre Schnittstelle IParams, so dass Sie nicht ein HashMap zu einem IParams gegossen. Dies hat nichts mit Generika zu tun.

IParams und HashMap sind "Geschwister", in dem Sinne, dass beide implementieren oder zu erweitern Map. Aber das bedeutet nicht, dass Sie eine HashMap so behandeln können, als wäre es eine IParams. Angenommen, Sie würden eine Methode zu Ihrer IParams Schnittstelle hinzufügen.

public interface IParams extends Map<String, String> { 
    void someMethod(); 
} 

Ofcourse, someMethod existiert nicht in HashMap. Wenn das Umwandeln von HashMap zu IParams funktionieren würde, was würden Sie erwarten, wenn Sie versuchen würden, die Methode aufzurufen?

IParams params = (IParams) new HashMap<String,String>(); 

// What's supposed to happen here? HashMap doesn't have someMethod. 
params.someMethod(); 

Im Hinblick auf Ihren Kommentar:

Die Absicht ist, eine Schnittstelle zu schaffen, die die Generika versteckt, und auch Mapkey String Definitionen

(im Beispiel nicht gezeigt) zu halten

Was Sie tun können, ist eine Klasse, die IParams implementiert und erweitert HashMap:

public class Params extends HashMap<String, String> implements IParams { 
    // ... 
} 

IParams params = new Params(); 
+1

Fantastische Erklärung, ich dachte nicht an Geschwister. Ich habe zu sehr versucht, die HashMap-Implementierung direkt zu verwenden, und Ihr Vorschlag, eine schnelle konkrete Klasse zu erstellen, sieht ziemlich vernünftig aus. Danke Jesper. –

3

HashMap implementiert Map Schnittstelle aber nicht Ihre Schnittstelle implementiert IParams obwohl Sie von Map abgeleitet Schnittstelle, können Sie es nicht zu IParams werfen, da es nicht eine Art von IParams