2017-07-26 4 views
0

Je vais créer un cours générique, d'abord je veux dire mon exigence. J'ai différentes classes, par exemple A, B etc. Je vais créer une instance de classe basée sur l'objet json. Cet objet json sera lu à partir du fichier. Le fichier peut contenir un objet json équivalent. Sur cette base, je vais créer une instance de cette classe en utilisant GSON. Maintenant, je fais face à une erreur à savoir incompatible types: T#1 cannot be converted to T#2types incompatibles: T # 1 ne peut pas être converti en T # 2

Ceci est mon exemple de code

public class JsonLoader<T> { 

    private final Gson gson = new Gson(); 

    private final T content; 

    public <T> JsonLoader(Class<T> clazz, String filePath) throws IllegalFileException { 
     if (filePath.isEmpty() || filePath == null) { 
      throw new IllegalFileException("IllegalFileException: source file must required."); 
     } 
     try (Reader reader = new FileReader(filePath)) { 
      T content= gson.fromJson(reader, clazz); 
      this.content = content; 

     } catch (IOException e) { 
      throw new IllegalFileException(e.getMessage(),e); 
     } 

    } 

    public <T> T getObject() { 
     return this.content; 
    } 
} 

S'il vous plaît aidez-moi.

+0

Pouvez-vous poster plus d'informations sur l'erreur? Numéro de ligne? –

+0

@Kevinrob 'types incompatibles: variable d'inférence T # 1 a des limites incompatibles contraintes d'égalité: T # 2 limites supérieures: T # 3, objet où T # 1, T # 2, T # 3 sont des variables de type: T # 1 étend l'objet déclaré dans la méthode fromJson (Reader, classe ) T # 2 étend l'objet déclaré dans le constructeur JsonLoader (classe , String) T # 3 étend l'objet déclaré en classe JsonLoader' –

Répondre

4

Lorsque vous déclarez le paramètre de type T sur la classe, le corps entier de la classe a accès à ce paramètre de type, vous n'avez donc pas besoin de le redéclairer. Lorsque vous dites public <T> JsonLoader et public <T> T getObject, vous déclarez de nouveaux paramètres de type avec le même nom qui ombrage le paramètre de type sur la classe.

Ceci est similaire à la façon dont vous pouvez déclarer une variable qui ombres un champ:

class Example { 
    int foo; 
    // parameter foo shadows the field foo 
    Example(int foo) {} 
} 

Si vous supprimez les déclarations de paramètres de type sur le constructeur et il devrait fonctionner.

+0

Oui, merci .. –