2016-07-11 1 views
0

J'essaie d'étendre LinkedHashMap à partir de ma classe Étudiants. Par ce que je veux apporter toutes les fonctionnalités d'une carte comme Map.put(value), Map.get(key). Je crée juste l'objet dans PSVM et ne fais pas de références statiques mais je reçois l'erreur ci-dessous. Est-ce que quelqu'un peut me signaler l'erreur que je commets ici? Y a-t-il également une meilleure approche pour réaliser la tâche? Merci d'avance!Erreur lors de l'extension de LinkedHashMap

import java.util.LinkedHashMap; 

public class Students<Integer,String> extends LinkedHashMap<Integer,String> { 

    public static void main(String args[]) {      // line 5 
     Students<Integer,String> students = new Students<>(); // line 6 
     students.put(1, "s1"); 
     students.put(2, "s2"); 
     students.put(3, "s3"); 

     System.out.println(students.get(1)); 
    } 

} 

Message d'erreur:

>> javac Students.java 
Students.java:5: error: non-static type variable String cannot be referenced from a static context 
     public static void main(String args[]) { 
           ^
Students.java:6: error: non-static type variable Integer cannot be referenced from a static context 
       Students<Integer,String> students = new Students<>(); 
         ^
Students.java:6: error: non-static type variable String cannot be referenced from a static context 
       Students<Integer,String> students = new Students<>(); 
           ^
Students.java:6: error: unexpected type 
       Students<Integer,String> students = new Students<>(); 
                   ^
    required: class 
    found: <Integer,String>Students<Integer,String> 
    where Integer,String are type-variables: 
    Integer extends Object declared in class Students 
    String extends Object declared in class Students 
4 errors 
+1

Vous avez nommé votre type générique utilisant des noms de classes Java standard. Votre code est similaire à la classe Students extends LinkedHashMap {'' Etudiants students = 'mais en lui' String' et 'Integer' ne seront pas traités comme' java.lang.String' ni 'java.lang.Integer' par défaut plus. – Pshemo

+0

Ne pas étendre, essayez d'utiliser la composition. –

+0

Merci Gaurava et @Pshemo –

Répondre

4

En faisant

class Student<Integer, String> 

Vous avez défini vos propres types génériques Integer et String. Ils sont associés à l'instance de la classe Student. Cependant, vous essayez également d'utiliser ces nouveaux types génériques dans votre méthode main() qui est une classe statique plutôt qu'une instance et ce n'est pas autorisé. Qu'est-ce que vous aviez l'intention d'utiliser comme java.lang.String

La solution simple est

  • ne définissez pas vous possédez des types génériques, vous n'avez pas besoin.
  • ne pas étendre LinkedHashMap mais plutôt utiliser la composition car cela limite les méthodes que vous exposer.

par exemple.

public class Students { 
    private final Map<Integer, String> map = new LinkedHashMap(); 

    public void put(int num, String str) { map.put(num, str); } 

    public String get(int num) { return map.get(num); } 

    public static void main(String args[]) { 
     Students students = new Students(); 
     students.put(1, "s1"); 
     students.put(2, "s2"); 
     students.put(3, "s3"); 

     System.out.println(students.get(1)); 
    } 
} 
+0

Eh bien. Bien que d'autres réponses fournissaient également la solution, voici la réponse exacte que je cherchais. Merci beaucoup.. ! –

+1

Puis-je savoir pourquoi l'extension de LinkedHashMap est obsolète. Est-ce moins efficace? –

+2

@SwadhikarC ce n'est pas une question d'efficacité, c'est le nombre de méthodes que vous exposez et que cette classe devrait maintenir dans le futur. LinkedHashMap a environ 60 méthodes et il y a de fortes chances que vous finissiez par utiliser une de ces méthodes d'une manière que LHM ou vous ne vouliez pas. –

1

Retirez les variables de type sur la déclaration de classe:

public class Students<Integer,String> extends LinkedHashMap<Integer,String> 

devrait être

public class Students extends LinkedHashMap<Integer,String> 

Vous déclarer effectivement des variables de type dont noms hap le stylo doit être le même que les classes Java, ce qui signifie que vos variables de type ont la priorité sur les noms de classe et les cachent; votre définition de classe est actuellement sémantiquement identique à:

public class Students<I, S> extends LinkedHashMap<I, S> 
+0

Eh bien c'est une explication soignée .. Merci pour le partage ..! –

1

Dans

public class Students<Integer,String> extends LinkedHashMap<Integer,String> 

vous déclarez des paramètres de type générique appelés Integer et String, qui cachent des noms standard de classe Java.

Si vous voulez que votre Students classe pour soutenir seulement java.lang.Integer clés et java.lang.String valeurs, utilisez:

public class Students extends LinkedHashMap<Integer,String> 

mais alors vous déclarer et instancier la classe avec:

Students students = new Students(); 

car il ne sera plus ont des paramètres de type génériques.

Si vous voulez que votre classe Students d'être générique, utiliser des noms plus standards pour les paramètres de type (qui ne cache pas les classes Java standard):

public class Students<K,V> extends LinkedHashMap<K,V> 
1

Avec la déclaration

class Students<Integer,String> ... 

vous ne faites pas référence aux classes existantes java.lang.Integer et java.lang.String mais vous déclarez votre propre type parameters pour une classe générique Students.

En tant que votre classe est déjà un LinkedHashMap<Integer,String> supprimer simplement les paramètres de type:

class Students extends LinkedHashMap<Integer,String> ... 

Comme une note de côté: Il est une bonne habitude de nommer vos propres paramètres de type pour les types génériques avec une seule lettre majuscule, qui a également empêche de telles confusions. Exemple: class Students<I, S> ....

1
public class Students<T,E> extends LinkedHashMap<T,E> {