2011-09-12 33 views
26

我偶然發現了一個我不明白的奇怪行爲。在泛型中添加@SuppressWarnings(「unchecked」)到單行生成eclipse編譯器錯誤

我必須投入一個字符串到一個泛型,它會產生一個警告。

Type safety : Unchecked cast from String to T 
  • 如果我添加@SuppressWarnings("unchecked")方法聲明 以上正常工作。

  • 如果我在賦值上面添加它,它會在eclipse中產生編譯器錯誤 。

這工作正常。

@SuppressWarnings("unchecked") 
public <T> T search(final String query){ 
T returnValue = null; 
... 
if(returnValue instanceof String){ 
    returnValue = (T) collection.getString(attrName); 
} 

這不行。

public <T> T search(final String query){ 
T returnValue = null; 
... 
if(returnValue instanceof String){ 
    @SuppressWarnings("unchecked") // Compiler error: "returnValue cannot be resolved to a type" 
    returnValue = (T) collection.getString(attrName); 
} 

任何想法是什麼導致兩種方法之間的差異壓制警告?

回答

41

你不能在任意表達式上註釋(可能他們稍後會添加它)。

你可以可以然而有註釋局部變量聲明。

那麼試圖編譯器做的,是來解釋returnValue作爲一種類型(因爲這是可以遵循的註釋的方法體內唯一)和失敗。

將註釋放在聲明returnValue在這種情況下不起作用。但是,您可以在初始化程序中執行強制轉換併爲其註釋的地方創建一個新的局部變量。

@SuppressWarnings("unchecked") 
T string = (T) collection.getString(attrName); 
returnValue = string; 
+0

來到這裏,因爲我不明白錯誤_「對令牌'結果的語法錯誤',在Eclipse中使用此令牌'_'後期望的VariableDeclaratorId。你的解釋是什麼編譯器嘗試以及爲什麼失敗很好!只需添加此評論,以防其他人搜索此語法錯誤。 – user1438038