2013-05-06 59 views
0

声纳说:“性能 - 可重构为一个名为静态内部类的类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()); 
    } 
} 
+2

问题是什么? – unholysampler 2013-05-06 13:39:13

+0

有些东西在这里很愚蠢。这个建议是一个不成熟的优化,是所有邪恶的根源。你甚至没有在循环中运行它。即使你做了,除非编译器真的很傻(代码是等价的),否则不应该有问题。 – 2013-05-06 14:17:35

+0

@JanHudec:我同意。如果这个东西可能* *可能是一个维护问题,但我看不出这个曾经可能是“表演”的问题... – 2013-05-06 14:24:05

回答

3

TypeToken是特殊的,因为它实际上取决于匿名类。而你的generified-type-token之所以不起作用,是因为TypeToken存在于第一位!泛型将在运行时被擦除。使用固定类型参数扩展泛型类是解决此限制的一种方法。

JavaDoc of Guava TypeToken(我知道你在谈论GSON,但使用和功能是在两个库一样,和番石榴一个具有更好的文档):

注意,它是关键实际的类型参数由一个子类携带。下面的代码是错误的,因为它仅捕获listType()方法签名的<T>类型变量;而<String>丢失在擦除:

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

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

我的建议:(通过手动添加例外理想地以自动的方式,可替代地)忽略该警告为TypeToken

+0

是否有另一种获得类型的方法? – dumper 2013-05-07 12:46:58