对于值类型,asInstanceOf[X] 和 toX 之间有什么区别吗?

2022-09-04 07:52:14

我使用了IntelliJ将Java代码转换为Scala代码的能力,这通常运行良好。

似乎IntelliJ将所有强制转换替换为对 .asInstanceOf

对于不能替换为 、 、 等的值类型,是否有任何有效的用法 ?asInstanceOf[Int]asInstanceOf[Long]toInttoLong


答案 1

我不知道有任何这样的情况。您可以通过编译类似

class Conv {
  def b(i: Int) = i.toByte
  def B(i: Int) = i.asInstanceOf[Byte]
  def s(i: Int) = i.toShort
  def S(i: Int) = i.asInstanceOf[Short]
  def f(i: Int) = i.toFloat 
  def F(i: Int) = i.asInstanceOf[Float]  
  def d(i: Int) = i.toDouble
  def D(i: Int) = i.asInstanceOf[Double]
}

和用于获取javap -c Conv

public byte b(int);
  Code:
   0:   iload_1
   1:   i2b
   2:   ireturn

public byte B(int);
  Code:
   0:   iload_1
   1:   i2b
   2:   ireturn

...

其中,您可以看到在每种情况下都会发出完全相同的字节码。


答案 2

好吧,而且不是演员。类型铸造的正确转换确实是。例如:toInttoLongasInstanceOf

scala> val x: Any = 5
x: Any = 5

scala> if (x.isInstanceOf[Int]) x.asInstanceOf[Int] + 1
res6: AnyVal = 6

scala> if (x.isInstanceOf[Int]) x.toInt + 1
<console>:8: error: value toInt is not a member of Any
       if (x.isInstanceOf[Int]) x.toInt + 1
                                  ^

推荐