开发者

Any differences between asInstanceOf[X] and toX for value types?

开发者 https://www.devze.com 2023-02-01 17:33 出处:网络
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.

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 asInstanc开发者_Python百科eOf[Int], asInstanceOf[Long] etc. for value types which can't be replaced by toInt, toLong, ...?


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.


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
                                  ^
0

精彩评论

暂无评论...
验证码 换一张
取 消