gpt4 book ai didi

scala - java.lang.Integer 不能转换为 java.lang.Byte 错误与 Scala 中的任何类型

转载 作者:行者123 更新时间:2023-12-04 22:46:08 25 4
gpt4 key购买 nike

我可以将 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

还有比这更好的方法吗?

最佳答案

在 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

为了克服这个问题,您可能需要进行额外的转换,例如字符串:
scala> x.toString.toInt
res6: Int = 10

scala> x.toString.toByte
res7: Byte = 10

关于scala - java.lang.Integer 不能转换为 java.lang.Byte 错误与 Scala 中的任何类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com