gpt4 book ai didi

scala - 如果Int不能为null,那么null.asInstanceOf [Int]是什么意思?

转载 作者:行者123 更新时间:2023-12-03 08:45:43 25 4
gpt4 key购买 nike

作为测试,我编写了以下代码:

object Ambig extends App {
def f( x:Int ) { println("Int" ) }
def f( x:String ) { println("String") }
f( null.asInstanceOf[Int ] )
f( null.asInstanceOf[String] )
f(null)
}

我期待在最后一次调用f()时出错,并说这是模棱两可的。编译器接受它,并产生以下输出:
Int
String
String

现在,我猜测这与以下事实有关:Int不是AnyRef,因此适用于f(null)的f的唯一版本是f(x:String)。但是,如果Int不能为null,那么null.asInstanceOf [Int]是什么意思?代表说它是Int类型的:
scala> :type null.asInstanceOf[Int]
Int

但我真的不知道它是如何工作的。毕竟,如果我尝试将String强制转换为Int,那么所有的事情都会变得一团糟:
scala> "foo".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...

当然,这是可以预期的-“foo”不能被构造为Int。但是都不可以为null,那么为什么将null强制转换为Int起作用呢?大概以某种形式装箱,但类型仍然是Int,不能为null ...

我想念什么?

最佳答案

null转换为Int的行为取决于完成操作的上下文。

首先,如果将null转换为Int,则实际上意味着装箱的整数,其值为null。如果将表达式放在期望的类型为Any的上下文中(由于在JVM字节码中无法引用原始类型和具有相同引用的引用类型,所以该表达式在幕后转换为Object),则此值将不再转换-这就是println(null.asInstanceOf[Int])打印null的原因。

但是,如果在期望原始Int(Java int)的上下文中使用同一框式整数值,则它将被转换为原始值,并且null被(作为引用类型的默认值)转换为0(默认值原始类型的值)。

如果使用通用方法进行转换,则自然会得到null

但是,如果此方法是专用的,则其返回类型为Int(在这种情况下为原始整数),因此必须像以前一样将null: Any值转换为原始值。

因此,运行:

object Test extends App {
println(null.asInstanceOf[Int])

def printit(x: Int) = println(x)

printit(null.asInstanceOf[Int])

def nullint[T] = null.asInstanceOf[T]

println(nullint[Int])

def nullspecint[@specialized(Int) T] = null.asInstanceOf[T]

println(nullspecint[Int])
}

产生:
null
0
null
0

关于scala - 如果Int不能为null,那么null.asInstanceOf [Int]是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10749010/

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