Любые различия между asInstanceOf [X] и toX для типов значений?

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

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

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

Ответ 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

Ну, 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
                                  ^