在Scala中,Any和Object有什么区别?

38

假设我有以下Java方法:

protected void onEvent(Object obj) {

    }

Scala编译器接受

protected override def onEvent(event: Any)

并且

protected override def onEvent(event: Object)

这两者有什么区别吗?

2个回答

26

Any 包括在Java中不是 Object 的东西;它包括基本类型和 NothingObject 是Java中相同的类,因此它肯定不包括基本类型。


8
如果你尝试调用一个使用Object的Java方法,如果你传入一个原始类型,Any会导致问题吗?还是它会被隐式转换? - James McMahon
1
@James 我尝试了 def met(a: java.lang.Object) = {}; val i = 10; met(i),这是编译器的输出:error: the result type of an implicit conversion must be more specific than AnyRef。https://dev59.com/518d5IYBdhLWcg3wsT0b#26550576,使用 val i: java.lang.Integer = 10(而不是默认的 val i: Int = 10)可以解决问题。 - Nicofisi

26

在scala-lang的文章中有一个很棒的图表(我甚至把它挂在了墙上)。还需要提到的是:

如果Scala在Java运行时环境中使用,则scala.AnyRef对应于java.lang.Object。


4
正确。请注意,“AnyRef”不是“Any”的子类,而是一个子类。“Any”还有一个子类“AnyVal”。 - Ernest Friedman-Hill
@Ernest 是的。图表非常清晰地显示了这一点。不理解。我错过了什么吗? - 4e6
3
没错,你没有错过任何内容;我只是想为那些没有跟着链接的人澄清一下。 - Ernest Friedman-Hill

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