J’ai utilisé la capacité d’IntelliJ pour convertir le code Java en code Scala, qui fonctionne généralement très bien.
Il semble qu’IntelliJ ait remplacé tous les asInstanceOf
par des appels à asInstanceOf
.
Existe-t-il une utilisation valide de asInstanceOf[Int]
, asInstanceOf[Long]
etc. pour les types de valeur qui ne peuvent pas être remplacés par toInt
, toLong
, …?
Je ne connais pas de tels cas. Vous pouvez vérifier vous-même que le bytecode émis est le même en compilant une classe comme
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] }
et en utilisant javap -c Conv
pour obtenir
public byte b(int); Code: 0: iload_1 1: i2b 2: ireturn public byte B(int); Code: 0: iload_1 1: i2b 2: ireturn ...
où vous pouvez voir que le même bytecode est émis dans chaque cas.
Eh bien, toInt
et toLong
ne sont pas des moulages. La conversion correcte du transtypage est asInstanceOf
. Par exemple:
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 :8: error: value toInt is not a member of Any if (x.isInstanceOf[Int]) x.toInt + 1 ^