asInstanceOf [X]和toX之间的值类型有何不同?

时间:2010-12-25 01:24:25

标签: java scala casting language-features

我使用IntelliJ的能力将Java代码转换为Scala代码,这些代码通常运行良好。

似乎IntelliJ通过调用asInstanceOf替换了所有演员阵容。

对于asInstanceOf[Int]asInstanceOf[Long],......无法替代的值类型,是否有toInttoLong等有效用法?

2 个答案:

答案 0 :(得分:16)

我不知道有任何此类案件。您可以通过编译类似

的类来检查自己发出的字节码是否相同
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

...

您可以看到在每种情况下都会发出完全相同的字节码。

答案 1 :(得分:6)

好吧,toInttoLong 强制转换。类型转换的正确转换确实是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
                                  ^