我有以下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 :(得分: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
。