为什么不能在isInstanceOf检查中使用AnyVal?

5
我在想,为什么AnyVal不能用于isInstanceOf检查? 这种行为背后的原因是什么?
scala> val c = 't'
c: Char = t

scala> c.isInstanceOf[AnyVal]
<console>:12: error: type AnyVal cannot be used in a type pattern or isInstanceO
f test
             c.isInstanceOf[AnyVal]

我猜这也与http://www.scala-lang.org/node/3271有关。 - om-nom-nom
1
谢谢,但是提供的链接并没有告诉我为什么它是这样的。我不想检查一个原始类型,我只是想知道为什么不能使用AnyVal?背景是什么?这种行为背后的规则是什么? - John Threepwood
@JohnThreepwood 对不起,我误解了。我无法撤销我的关闭投票,但是这里有一个回答您的问题。 - paradigmatic
一些关于 Any、AnyVal、AnyRef 等的信息,请参考此链接:https://dev59.com/_HE95IYBdhLWcg3wY81l。 - kiritsuku
1
在我看来,这似乎不是重复的问题。一个人在问如何做到,而另一个人(也就是这个问题)在问为什么不可能实现。 - Daniel C. Sobral
显示剩余2条评论
1个回答

11

AnyVal 在运行时不再存在,只在编译时存在。换句话说,它只是编译器将JVM原始类型视为一等对象的"技巧"。

然而,isInstanceOf 方法是在运行时执行的,因此它无法正常工作。因此会导致编译器出错。


我不确定这是丑还是好看。 - Karel Bílek
1
好的,“isInstanceOf” 在 Scala 中被认为是丑陋的 ;-) 您应该依赖于类型系统在编译时获取那种信息。 - paradigmatic
我可能很蠢,但我不理解这个答案的逻辑。通常情况下,您不会禁止布尔方法,只因为答案总是“false”。而且 1.isInstanceOf[Int] 运行良好... 而链接的“重复”问题的答案表明,在运行时可以实现这样的方法。 - Luigi Plinge
在https://dev59.com/lGkv5IYBdhLWcg3wsC3i中的被接受答案基于隐式证据,这个证据也在编译时解决。 - paradigmatic
我刚刚尝试在1.isInstanceOf[Int]上运行javap。它依赖于装箱并在运行时检查装箱后的1是否是java.lang.Integer的实例。 - paradigmatic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接