相关疑难解决方法(0)

Any,AnyVal,AnyRef,Object之间的关系是什么?它们在Java代码中使用时如何映射?

我通常最终尝试每个组合,直到它编译.有人可以解释我应该在哪里使用?

scala

108
推荐指数
3
解决办法
3万
查看次数

如何测试AnyVal的值?

试过这个:

scala> 2.isInstanceOf[AnyVal]
<console>:8: error: type AnyVal cannot be used in a type pattern or isInstanceOf test
              2.isInstanceOf[AnyVal]
                            ^
Run Code Online (Sandbox Code Playgroud)

还有这个:

scala> 12312 match {
     | case _: AnyVal => true
     | case _ => false
     | }
<console>:9: error: type AnyVal cannot be used in a type pattern or isInstanceOf test
              case _: AnyVal => true
                      ^
Run Code Online (Sandbox Code Playgroud)

这条消息非常有用.我知道我不能使用它,但我该怎么办?

scala

13
推荐指数
2
解决办法
2688
查看次数

Scala类层次结构中的不规则性

Scala在Java的类型系统上叠加了一个非常优雅的类层次结构,从顶部的Any,到AnyRef和AnyVal分别覆盖Java的对象和基元,然后最终收敛,将引用类型折叠到Null,将所有类型折叠到Nothing上.据我所知,没有什么是一切的子类型; Null AnyRef/java.lang.Object的所有子类型的子类型.[见http://www.scala-lang.org/node/128 ]

但是,似乎存在一些不规则性,一些地方不能简单地将所有Scala类型视为无缝类型层次结构的元素.我觉得这很令人厌烦,想要了解我可能感到惊讶的地方.

到目前为止,我知道一些违规行为:

1)虽然Null是AnyRef的子类型,但调用null.isInstanceOf [AnyRef](或AnyRef的其他子类型)会返回false.我怀疑这被选择与Java的instanceof运算符的行为一致.

2)无论方差注释如何,一切都与Nothing协变.如果我有一个方法返回一个没有标记协变的类型T,我可以覆盖该方法返回类型Nothing.[注意:这个说法有误,请参阅下面的答案和评论!]

3)我不能将isInstanceOf应用于AnyVal类型[请参阅为什么AnyVal不能用于isInstanceOf检查?以及如何测试AnyVal的值?]

4)是违法的问是否东西isInstanceOf [空],这是要求完全一致的东西(虽然不是特别必要的,因为"myVar的== NULL"将给出相同的答案)

在Scala的类型层次结构中是否存在其他不规则或特殊情况的示例?我觉得这些值得学习和理解,以避免不受欢迎的惊喜.

scala

4
推荐指数
1
解决办法
407
查看次数

标签 统计

scala ×3