2012-10-14 43 views
6

我已經做了大量的搜索這個編譯器錯誤<identifier> expected的含義,並沒有一個似乎適用於我的情況。真的很抱歉,如果這是重複的或基本的信息,但我找不到任何地方。Java編譯器錯誤沒有任何意義(<identifier>預計)

以下代碼正常工作。請注意,我是積極的myObject1確實是HashSet<String>所以演員陣容沒問題。

@SuppressWarnings("unchecked") 
HashSet<String> s1 = (HashSet<String>) myObject1; 

以下代碼無法正常工作。它會編譯,但帶有警告。

@SuppressWarnings("unchecked") 
HashSet<String> s1; 
s1 = (HashSet<String>) myObject1; 

那麼我試試下面的代碼。

@SuppressWarnings("unchecked") 
HashSet<String> s1; 
@SuppressWarnings("unchecked") 
s1 = (HashSet<String>) myObject1; 

現在甚至拒絕編譯,給我<identifier> expected錯誤令人費解的是我這麼多。我的命令行中的^符號正好指向最後一行的=之前。我不確定我究竟會在s1=之間放置什麼。

任何想法?謝謝!

+0

由於編譯器期望在那裏有一個聲明,所以's1'被解析爲一個類型名稱,當然它期望一個名爲next的類型爲's1'的實體。 –

+1

在問題範圍之外,您應該使用'Set '而不是'HashSet '。即使你在開發階段知道實現類,你也應該考慮接口。如果稍後有人決定將代碼移動到'TreeSet',團隊*必須*將所有具有'HashSet'的文件改變並移動到'TreeSet'? –

+0

感謝Luiggi,我知道你剛剛在另一個問題中告訴我同樣的事情,我仍然在這裏犯了同樣的錯誤......感謝提醒。 :-) – The111

回答

11

您不能將註釋應用於簡單的賦值語句。從section 9.7 of the JLS

註解可以任何聲明被用作調節劑,是否包(第7.4.1節),類(§8.1.1)(包括枚舉(§8.9)),接口(§9.1.1 )(包括註釋類型(§9.6)),字段(§8.3.1,§9.3),方法(§8.4.3,§9.4),形式參數(§8.4.1),構造函數(§8.8.3),或局部變量(第14.4.1節)。

我同意編譯器錯誤消息可能是相當清晰的,無可否認...

+0

謝謝喬恩。我編輯了我的OP,以反映我真正想做的事情。如果我想在一行中聲明's1',但稍後將其分配......是否有辦法壓制我分配的警告?除了爲整個方法添加註釋外,當然這看起來很sl。。 – The111

+3

使用臨時變量並稍後將臨時變量分配給s1,而臨時變量具有正確的類型 – daniel