Des différences entre asInstanceOf et toX pour les types de valeur?

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 ^