2016-05-23 10 views
1

I StringMap Klasse verwenden, wie unten Map Erklärung zu vereinfachen:Erste in der Karte von Generika befreien

public interface StringMap extends Map<String, String> { 
    interface Entry extends java.util.Map.Entry<String, String>{ 

    } 
} 
public class StringHashMap extends HashMap<String, String> implements StringMap{ 

} 

Das Problem ist, dass ich nicht StringMap.Entry die gleiche Art und Weise wie StringMap arbeiten. Wenn ich dies tun:

StringMap strings = new StringHashMap(); // this works perfectly fine 
for (StringMap.Entry entry : strings.entrySet()) { // this doesn't work 
} 

ich diesen Fehler:

Error:(402, 49) java: incompatible types: java.util.Map.Entry<java.lang.String,java.lang.String> cannot be converted to com.nicksoft.nslib.StringMap.Entry 

Gibt es eine Möglichkeit, um es?

Edit:

Ich beginne zu realisieren dies nicht möglich ist. Zumindest ist es mit vertretbarem Aufwand nicht möglich. Ich denke, wenn es wäre, hätte ich jemanden gefunden, der es macht. Aber wenn jemand Tricks hat, die Code lesbarer machen können - lassen Sie es mich wissen.

+0

Ich glaube, das würde kategorisieren als [die Pseudo-Typdef Antipattern] (http://www.ibm.com/developerworks/java/library/j-jtp02216/index.html) –

+0

Dann möchte ich wirklich das implementieren Antipattern. Ich interessiere mich nicht für Designmuster. Vielen Dank für Ihren Besuch und Ihre Meinung. – NickSoft

+0

@JornVernee Nun, ich lese darüber und, ja, es ist schlecht, weil Sie die Elternklasse nicht übergeben können, wenn der Erbe gewünscht wird. Es nervt, dass Java keine Typedef hat. Ich stimme jedoch nicht zu, dass (nicht pseudo) typedef eine schlechte Sache ist. Ich denke, wenn Sie in Java schreiben wollen, müssen Sie den Regeln von Java folgen. Warum hast du das geschrieben? Jetzt bin ich nicht so sicher, dass ich es benutzen möchte ... Ich könnte es immer noch für interne Objekte verwenden, die nie außerhalb ihrer Klasse gehen. – NickSoft

Antwort

1

Das liegt daran, dass die Methode entrySet() nicht überladen wird, um den Typ com.nicksoft.nslib.StringMap.Entry zurückzugeben.

Wie Sie können nicht die entrySet() -Methode überschreiben, um es zu zwingen Sie Ihre eigene Art zurück, dann ist die einzige Option, die Sie haben, ist es umbenennen:

public interface StringMap extends Map<String, String> { 
    interface Entry extends java.util.Map.Entry<String, String>{ 

    } 
    Set<Entry> myEntrySet(); 
} 
public class StringHashMap extends HashMap<String, String> implements StringMap{ 
    public Set<Entry> myEntrySet() { 
    //The implementation to return the set of your own entry type. 
    } 
} 

Dann ist Ihre Schleife aussehen würde:

for (StringMap.Entry entry : strings.myEntrySet()) { 
} 
+0

Es ist etwas, das funktionieren würde, aber ich hoffte auf etwas weniger komplex. Ich möchte nicht entrySet() implementieren. Was noch wichtiger ist: Ich möchte nicht jedes Mal eine Kopie der Einträge erstellen, wenn ich diese Methode aufruft. Dies wäre nicht gerechtfertigt, wenn der Code klarer dargestellt würde (durch Vereinfachung der Erklärungen). – NickSoft