我可以将Int数据转换为Byte。
scala> 10.asInstanceOf[Byte]
res8: Byte = 10
但是在Any类型中使用相同的值时,强制转换会引发错误。
scala> val x : Any = 10
x: Any = 10
scala> x.asInstanceOf[Byte]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte
at scala.runtime.BoxesRunTime.unboxToByte(BoxesRunTime.java:98)
at .<init>(<console>:10)
我可以投两次。
scala> val y = x.asInstanceOf[Int]
y: Int = 10
scala> y.asInstanceOf[Byte]
res11: Byte = 10
有比这更好的方法吗?
答案 0 :(得分:7)
在Scala中,编译器试图隐藏基本类型和引用类型(盒装)之间的区别,默认为基元。有时,抽象泄漏,你会看到那种问题。
在这里,您假装该值为Any,这需要编译器回退到盒装值:
override def set(value:Any) = {
if (check(value.asInstanceOf[Byte])) {
在这里,你并没有将值限制为引用,所以这样的转换将在原始类型上完成:
10.asInstanceOf[Byte]
换句话说:
scala> val x: Any = 10
x: Any = 10
scala> x.asInstanceOf[Byte]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte
at scala.runtime.BoxesRunTime.unboxToByte(BoxesRunTime.java:97)
... 32 elided
scala> val y: Int = 10
y: Int = 10
scala> y.asInstanceOf[Byte]
res4: Byte = 10
要解决此问题,您可能需要额外转换为String:
scala> x.toString.toInt
res6: Int = 10
scala> x.toString.toByte
res7: Byte = 10
答案 1 :(得分:3)
尝试转换为int,然后转换为Byte:
scala> val x : Any = 10
x: Any = 10
scala> x.asInstanceOf[Int].asInstanceOf[Byte]
res1: Byte = 10
或者像IonuţG。Stan所说:
scala> x.asInstanceOf[Int].toByte
res4: Byte = 10
虽然我无法解释为什么会这样做。
答案 2 :(得分:0)
Java中的整数是32位,而一个字节显然是8位。问题是你截断什么位以使整数成为一个字节?最低有效24位还是最高有效24位?正确的答案是在您的问题的背景下。