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很特别,因为它实际上依赖于那个匿名类。而您的通用类型令牌不起作用的原因TypeToken是首先存在的原因!泛型将在运行时被擦除。扩展具有固定类型参数的泛型类是绕过该限制的一种方法。

请参阅Guava 的 JavaDocTypeToken(我知道您在谈论 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 回答