2017-07-26 16 views
0

私はジェネリッククラスを1つ作成します。私は異なるクラスを持っています。 A、Bなど。jsonオブジェクトに基づいてクラスのインスタンスを作成します。このjsonオブジェクトはファイルから読み込まれます。ファイルには相当するjson object.basedが含まれています.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で宣言された3 –

答えて

4

クラスに型パラメータTを宣言すると、クラス本体全体がその型パラメータにアクセスできるため、再宣言する必要はありません。 public <T> JsonLoaderpublic <T> T getObjectと言うと、実際にはクラスの型パラメータをシャドウする同じ名前の新しい型パラメータが宣言されています。あなたはそれだけで動作するはずコンストラクタとメソッドの型パラメータ宣言を削除した場合

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

これは、フィールドをシャドウ変数を宣言することができますどのように似ています。

+0

はいありがとうJsonLoader'クラスで宣言されたオブジェクトを拡張 Tの#.. –

関連する問題