为什么我使用以下代码获得“遵循此构造的死代码”?

时间:2014-02-26 15:38:50

标签: scala

我有以下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)

我非常感谢您收到此错误的任何想法!

1 个答案:

答案 0 :(得分:32)

查看fromJson的{​​{3}}:

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

如您所见,此方法具有类型参数T,但您在未指定的情况下调用它。这样,类型推断器将其理解为new Gson().fromJson[Nothing](m, t),并为整个表达式分配了类型Nothing

在Scala中,Nothing是底部类型,是所有类型的子类型,没有值。返回Nothing的方法保证永远不会返回,因为它们总是抛出异常,陷入无限循环,强行终止程序(例如sys.exit())等等。在你的情况下,{{1当JVM尝试将其结果转换为fromJson时,调用将导致抛出ClassCastException。因此,在该调用之后的所有内容都是死代码。

此类推理行为与Java不同,后者通常会在此处推断出Nothing