繁体   English   中英

java.lang.Integer不能使用Scala中的任何类型转换为java.lang.Byte错误

[英]java.lang.Integer cannot be cast to java.lang.Byte error with Any type in Scala

我可以将Int数据转换为Byte。

scala> 10.asInstanceOf[Byte]
res8: Byte = 10

但是,如果使用任何类型的相同值,则转换会引发错误。

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

还有比这更好的方法吗?

在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

尝试转换为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

虽然我无法解释为什么这项工作。

Java中的整数是32位,而字节显然是8位。 问题是你截断什么位以使整数成为一个字节? 最低有效24位还是最高有效24位? 正确的答案是在您的问题的背景下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM