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

在这种情况下,不是特征的第一个类是AA with B 将被视为A

【讨论】:

以上是关于scala强制转换不兼容类型而不会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

怎样让vs2013不进行强制类型转换

隐式转换 & 强制转换

指针与强制类型转换

SV强制类型转换和常数

C++ --- 强制转换运算符

JS强制类型转换,隐式类型转换, == 和===的区别