3 回答

TA贡献1799条经验 获得超6个赞
null是一个String变量,指向什么?
可以将空引用转换为任何类类型的表达式。所以在这种情况下String
,这很好:
String x = null;
String
选择此处的重载是因为Java编译器根据JLS的第15.12.2.5节选择最具体的重载。特别是:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
在第二种情况下,两种方法仍然适用,但既不是String
也不StringBuffer
比另一种更具体,因此两种方法都不比另一种方法更具体,因此编译器错误。

TA贡献1796条经验 获得超4个赞
此外,JLS 3.10.7还声明“null”是“null类型”的文字值。因此存在一种称为“null”的类型。
稍后,JLS 4.1声明存在一个无法声明变量的null类型,但您只能通过null文本使用它。后来它说:
null引用总是可以进行任何引用类型的扩展引用转换。
为什么编译器选择将它扩展为String可能会在Jon的答案中解释。

TA贡献1802条经验 获得超6个赞
要回答标题中的问题:null
既不是a String
也不是a Object
,但可以指定对其中任何一个的引用null
。
我真的很惊讶这个代码甚至编译。我之前尝试过类似的东西,但我收到编译错误,说这个调用是模棱两可的。
但是,在这种情况下,似乎编译器正在选择食物链中最低的方法。假设您需要方法的最不通用版本以帮助您。
我将不得不看看我是否可以挖掘出这个(貌似)完全相同的情况下我遇到编译器错误的例子,尽管...]
编辑: 我明白了。在我制作的版本中,我有两个重载方法接受a String
和a Integer
。在这种情况下,没有“最具体”参数(如Object
和String
),因此它不能在它们之间进行选择,这与您的代码不同。
很酷的问题!
添加回答
举报