0

Sonar は、「パフォーマンス - 名前付き静的内部クラスにリファクタリングできます クラス DataServiceImpl$2 は、名前付き静的内部クラスにリファクタリングできます」と言います。

paramsClass1.add(new TypeToken<List<EntityFieldMap>>(){}.getType());

そのため、静的クラスを作成しましたが、正常に動作しますが、汎用にすると動作しません。このスニペットを見てください。

import com.google.gson.reflect.TypeToken;
public class TokenTest
{
    public static class MyInnerClass1<T> extends TypeToken<T> {};
    public static class MyInnerClass2<Integer> extends TypeToken<Integer> {};

    public static void main(String[] args)
    {
        //prints T
        System.out.println(new MyInnerClass1<Integer>().getType());
        //prints Integer which is desired
        System.out.println(new MyInnerClass2().getType());
    }
}
4

1 に答える 1

3

TypeToken実際にはその匿名クラスに依存しているため、特別です。そして、generified-type-token が機能しない理由は、そもそもTypeToken存在する理由です! ジェネリックは実行時に消去されます。固定型パラメーターを使用してジェネリック クラスを拡張することは、その制限を回避する方法です。

Guava の JavaDoc をTypeToken参照してください(GSON について話していることは知っていますが、使用と機能は両方のライブラリで同じであり、Guava の方がドキュメントが優れています)。

実際の型引数がサブクラスによって運ばれることが重要であることに注意してください。次のコードは、メソッド シグネチャの<T>型変数のみをキャプチャするため、間違っています。listType()while<String>は消去で失われます:

class Util {
  static <T> TypeToken<List<T>> listType() {
    return new TypeToken<List<T>>() {};
  }
}

TypeToken<List<String>> stringListType = Util.<String>listType();

私の提案: この警告は無視してくださいTypeToken(理想的には自動化された方法で、代わりに手動で例外を追加します)。

于 2013-05-06T14:13:20.543 に答える