Любые различия между 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
^