Any differences between asInstanceOf[X] and toX fo

2020-07-02 22:36发布

I used IntelliJ's ability to convert Java code to Scala code which generally works quite well.

It seems that IntelliJ replaced all casts with calls to asInstanceOf.

Is there any valid usage of asInstanceOf[Int], asInstanceOf[Long] etc. for value types which can't be replaced by toInt, toLong, ...?

2条回答
做个烂人
2楼-- · 2020-07-02 22:46

I do not know of any such cases. You can check yourself that the emitted bytecode is the same by compiling a class like

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]
}

and using javap -c Conv to get

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

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

...

where you can see that the exact same bytecode is emitted in each case.

查看更多
姐就是有狂的资本
3楼-- · 2020-07-02 22:56

Well, toInt and toLong are not casts. The correct conversion of type casting is asInstanceOf indeed. For example:

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
                                  ^
查看更多
登录 后发表回答