2017-07-26 151 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

是謝謝你..對象 –

相關問題