scala强制转换不兼容类型而不会引发错误
Posted
技术标签:
【中文标题】scala强制转换不兼容类型而不会引发错误【英文标题】:scala cast incompatible type without throwing error 【发布时间】:2021-06-03 23:57:27 【问题描述】:Scala 版本 2.13
更新:
我认为t
不能转换为A with B
,因为t
不能是B
。
喜欢下面的代码。
t
在运行时创建时没有任何异常,这不是预期的。
a
不能是 B
。
打印出来的(false, false)
也表明了这一点。
class Base
class A extends Base
override def toString: String = "obj A"
trait B extends Base
override def toString: String = "obj B"
type t1 = A with B
val a = new A
val t = a.asInstanceOf[t1]
println(a,t)
println(a.isInstanceOf[t1], a.isInstanceOf[B])
【问题讨论】:
您的问题是什么?我不明白。 我认为他的问题是为什么asInstanceOf[A with B]
在A
类型上调用时不会抛出异常。我认为这里涉及到一些运行时魔法,因为B
是这里的特征。例如显式调用t.toString
会抛出异常。
【参考方案1】:
我不知道为什么有一个答案消失了,但它解释了原因。我在这里重申一下。
很像
Unexpected behavior with compound types
这是Scala中的类型擦除,在
中有解释https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#type-erasure
在这种情况下,不是特征的第一个类是A
,A with B
将被视为A
。
【讨论】:
以上是关于scala强制转换不兼容类型而不会引发错误的主要内容,如果未能解决你的问题,请参考以下文章