【发布时间】:2016-03-19 08:56:06
【问题描述】:
试试这个:
object Box {
val stuff:Any = "something"
def foo[T]():T = {
val z = stuff
println(s"z = $z class = ${z.getClass.getName}")
val y = z.asInstanceOf[T]
println(s"y = $y class = ${y.getClass.getName}")
y
}
}
println(Box.foo[Boolean]())
运行时我得到输出:
z = something class = java.lang.String
y = something class = java.lang.String
所以即使 stuff 是 Any 类型,它确实知道 z(从 stuff 分配)是一个字符串。我显然试图将其转换为 T,这显然是我的 println 语句中的布尔值。这怎么不炸?为什么它认为 y 是一个字符串?
如果我将 foo() 中的 T 硬连接到布尔值,我会得到预期的失败输出:
z = something class = java.lang.String
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at scala.runtime.BoxesRunTime.unboxToBoolean(BoxesRunTime.java:85)
...
就好像它完全忽略了我的 .asInstanceOf[T]。为什么?
【问题讨论】:
-
由于部分类型擦除,
.asInstanceOf[T]不可能做任何事情。转换为泛型类型在 Java 中也不起作用。这是JVM的限制。编译器不会在那一行给你一个警告吗? -
在
2.12.0-M3上,当用Boolean替换val y = z.asInstanceOf[T]的T时,我得到<console>:18: error: type mismatch; found : y.type (with underlying type Boolean) required: T y ^。
标签: scala