Есть ли различия между asInstanceOf [X] и toX для типов значений? - PullRequest
13 голосов
/ 25 декабря 2010

Я использовал способность IntelliJ конвертировать код Java в код Scala, который в целом работает довольно хорошо.

Кажется, что IntelliJ заменил все приведения на вызовы asInstanceOf.

Есть ли какие-либо действительныеиспользование asInstanceOf[Int], asInstanceOf[Long] и т. д. для типов значений, которые не могут быть заменены на toInt, toLong, ...?

Ответы [ 2 ]

16 голосов
/ 25 декабря 2010

Я не знаю ни одного такого случая.Вы можете убедиться, что испускаемый байт-код совпадает, скомпилировав класс, подобный

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

...

, где вы можете увидеть, что тот же байт-кодиспускается в каждом случае.

7 голосов
/ 26 декабря 2010

Ну, toInt и toLong являются , а не приведениями.Правильное преобразование приведения типов действительно asInstanceOf.Например:

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