2012-11-05 14 views
8

Ho bisogno di creare una classe personalizzata che estende java.util.LinkedHashMap e prende String come chiave e String come valore e ha un costruttore no-arg che precompila questa mappa con valori iniziali.Come estendere HashMap per consentire stringhe, tipi di stringhe

Sono bloccato alla prima attività: come estendere la LinkedHashMap in modo tale che invece di argomenti generici accetta solo?

Ho provato questo, (non funzionante)

import java.util.LinkedHashMap; 

@SuppressWarnings("serial") 
public class MyMenu<String, String> extends LinkedHashMap<String, String> { 


    public MyMenu(){ 
     this.put("index.jsp", "Home Page"); 
    } 
} 
+0

Hai dimenticato di completare l'ultima frase. Ad ogni modo, non importa, a meno che tu non mostri del codice che potresti aver provato. –

+3

Estendere LinkedHashMap è quasi certamente una cattiva soluzione. Puoi usare il suo modulo parametrizzato o usare la composizione invece dell'ereditarietà. –

+0

Non avrei problemi con la composizione, ma poi avrei bisogno di un metodo getter per getMap() dal mio oggetto.Volevo che il mio oggetto fosse una HashMap quindi sarebbe più facile da usare da jsp con jstl – Wil

risposta

8

Tutto ciò che serve è:

import java.util.LinkedHashMap; 

@SuppressWarnings("serial") 
public class MyMenu extends LinkedHashMap<String, String> { 

    public MyMenu(){ 
     this.put("index.jsp", "Home Page"); 
    } 
} 

Rimuovere <String, String> dal nome della classe e funzionerà. Stai creando una classe che sta estendendo LinkedHashMap<String, String> in modo che la tua classe sia già una Map che richiede String come chiave e String come valore. Se si desidera creare la propria classe generica allora dovete fare in questo modo:

creare una classe per esempio:

public class MyMenu<K, V> { ... } 

e quindi estendere tale classe:

public class SomeMyMenu extends MyMenu<String, String> { ... } 

In tal caso sarà necessario specificare la chiave e il valore per la classe in modo che la classe SomeMyMenu utilizzi la chiave e il valore come String. Puoi leggere di più sui generici here.

ma più efficiente modo per fare quello che vuoi è quello di creare un po 'di classe finale e dichiarare la mappa in questo modo:

public static final LinkedHashMap<String, String> MAP = new LinkedHashMap<String, String>() {{ 
    put("index.jsp", "Home Page"); 
}}; 

E per ottenere i valori dall'uso mappa:

SomeClass.MAP.get("Some Key"); 
+0

Grazie. Questo ha funzionato. Mi piacerebbe ancora ottenere spiegazioni perché non ho bisogno di dopo MyMenu? Sto imparando a lavorare con i generici in Java e qualsiasi buona spiegazione mi è molto utile. – Wil

2

Se la vostra lotta, come lei, è solo con la dichiarazione, quindi vorrei provare qualcosa di simile:

class MyCustomizedMap extends LinkedHashMap<String, String> { 
    //... 
} 
1

Prova:

public class MyMap extends LinkedHashMap<String, String> { ... } 
2

Si potrebbe fare qualcosa di simile di seguito:

public class MyMap extends LinkedHashMap<String,String>{ 
1

Finché si utilizza JDK 1.5 o superiore, è possibile utilizzare farmaci generici e creare un LinkedHashMap che memorizza le chiavi di stringa e valori di stringa e inizializzare come segue:

LinkedHashMap<String, String> myMap = new LinkedHashMap<String, String>() 
{ 
    { 
     put("abc", "xyz"); 
     ... 
    }; 
} 
1

composizione è una soluzione migliore rispetto eredità nel tuo caso:

class MyProperties implements Map<String, String> { 

    private Map<String, String> delegatee = new LinkedHashMap<String, String>(); 

    // ... delegate your methods to delegatee 
} 
+1

La composizione è quasi sempre migliore dell'ereditarietà. +1 – durron597

+0

Ma non "sempre" – R1K0

Problemi correlati