2013-05-06 37 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