Почему я получаю "Мертвый код после этой конструкции" со следующим кодом?

У меня есть следующий scala code

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)

Любые идеи, почему я получаю эту ошибку, очень ценятся!

Ответ 1

Посмотрите подпись fromJson:

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

Как вы можете видеть, этот метод имеет параметр типа T, но вы его вызывали без указания его. Таким образом, тип inferencer понимал его как new Gson().fromJson[Nothing](m, t), и всему выражению присваивался тип Nothing.

В Scala, Nothing - это нижний тип, который является подтипом всех типов и не имеет значений. Методы, возвращающие Nothing, никогда не вернутся, потому что они всегда генерируют исключение, попадают в бесконечный цикл, принудительно завершают программу (например, sys.exit()) и т.д. В вашем случае вызов fromJson вызовет ClassCastException, если JVM пытается передать результат в Nothing. Поэтому все после этого звонка является мертвым кодом.

Такое поведение вывода типа отличается от Java, которое обычно выводит здесь new Gson().<Object>fromJson(m, t).