作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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());
}
}
最佳答案
TypeToken
很特别,因为它实际上依赖于那个匿名类。而你的通用类型 token 不起作用的原因就是 TypeToken
的原因首先存在!泛型将在运行时被删除。使用固定类型参数扩展泛型类是绕过该限制的一种方法。
请参阅JavaDoc of Guava TypeToken
(我知道你在谈论 GSON,但这两个库的用法和功能是相同的,并且 Guava 拥有更好的文档):
Note that it's critical that the actual type argument is carried by a subclass. The following code is wrong because it only captures the
<T>
type variable of thelistType()
method signature; while<String>
is lost in erasure:class Util {
static <T> TypeToken<List<T>> listType() {
return new TypeToken<List<T>>() {};
}
}
TypeToken<List<String>> stringListType = Util.<String>listType();
我的建议:忽略 TypeToken
的此警告(理想情况下以自动化方式,或者通过手动添加异常(exception))。
关于java - 声纳性能 - 类型 token 的静态内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16406656/
我是一名优秀的程序员,十分优秀!