2017-07-26 120 views
0

我要创建一个泛型类,首先我想说我的需求。我有不同的课程,例如A,B等。我将根据json对象创建一个类的实例。这个json对象将从文件中读取。该文件可能包含等效的json对象。基于它,我将使用GSON创建该类的一个实例。现在,我面对一个错误即incompatible types: T#1 cannot be converted to T#2不兼容的类型:T#1不能转换为T#2

这是我的代码示例

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; 
    } 
} 

请帮助我。

+0

你能发布更多关于错误的信息吗?电话号码? –

+0

@Kevinrob'不相容的类型:推理变量T#1具有不兼容的边界 等式约束:T#2 上限:T#3,对象 其中T#1,T#2,T#3是类型变量: T#1延伸方法声明的对象fromJson(读卡器,类) T#2扩展对象在构造 JsonLoader声明(类,字符串) T#3扩展了类中声明JsonLoader' –

回答

4

当您在类上声明类型参数T时,整个类的主体都可以访问该类型参数,因此不需要重新声明它。当你说public <T> JsonLoaderpublic <T> T getObject时,你实际上声明了具有相同名称的新类型参数,该类型参数影响类的类型参数。

这类似于如何可以声明其隐藏了场变量:

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

如果您删除的构造函数和方法,它应该只是工作的类型参数声明。

+0

是谢谢你..对象 –

相关问题