2014-02-26 62 views
12

我有以下Scala代碼爲什麼我用下面的代碼得到'這個結構下面的死代碼'?

def message(attachmentId: UUID) : URI = { 
    var r : mutable.MutableList[BasicTemplate] = new mutable.MutableList[BasicTemplate] 
    val t : Type = new TypeToken[Iterable[BasicTemplate]](){}.getType() 
    val m : String = "[{\"basicTemplate\":\"TEMPLATE\",\"baseline\":\"DEMO\",\"identifier\":\"0599999999\"}]" 

    r = new Gson().fromJson(m, t) 
    Console.println(r.head.getBasicTemplateName) 

    URI.create("http://google.com") 
} 

而且它給了我下面的編譯錯誤:

[ERROR] Class1.scala:402: error: dead code following this construct 
[ERROR] r = new Gson().fromJson(m, t) 

任何想法,爲什麼我得到這個錯誤的高度讚賞!

+0

您不需要在聲明變量後指定類型。 – wheaties

+0

可能是由'r'重新分配造成的。更多信息 - https://issues.scala-lang.org/browse/SI-6339 – fiction

+0

我不知道你的錯誤,但你創建了一行「var r ... = new ...」列表,然後你爲什麼你不使用val r = new Gson()... – Arne

回答

27

看那fromJsonsignature

public <T> T fromJson(String json, Type typeOfT) 

正如你所看到的,這種方法有類型參數T,但你稱它沒有具體說明。這樣,類型推理器將其理解爲new Gson().fromJson[Nothing](m, t),並且整個表達式被分配了類型Nothing

在斯卡拉,Nothing是一種底部類型,它是所有類型的子類型並且沒有值。返回Nothing的方法保證永不返回,因爲它們總是拋出異常,陷入無限循環,強行終止程序(例如sys.exit())等等。在你的情況下,調用fromJson將導致ClassCastException被拋出JVM嘗試將結果轉換爲Nothing。因此,該呼叫之後的所有內容都是死碼。

此類型推斷行爲與Java不同,後者在此通常會推斷new Gson().<Object>fromJson(m, t)

+0

非常感謝您的評論,我很新到斯卡拉,請問您可以建議從Scala的Json方法調用此方法的正確方法是什麼? 我認爲Scala應該理解t他返回類型應該是相同的類型的變量'r' – AVE

+0

@AVE我想你需要明確指定你的類型:'新的Gson()。fromJson [mutable.MutableList [BasicTemplate]](m,t)' – ghik

+1

@ AVE雖然我必須承認,我越想這件事,越是開始懷疑它是一個錯誤。 – ghik