gpt4 book ai didi

scala - Scala 中 Object 和 AnyRef 的区别

转载 作者:行者123 更新时间:2023-12-05 00:46:50 24 4
gpt4 key购买 nike

来自 this schemeUnified typed我认为 Scala 之旅中的文章 AnyRefObject是完全等价的。

然而,在 Eclipse 中检查声明时,我发现了一些有趣的事情:

object ClassTag {

val Object : ClassTag[java.lang.Object] = Manifest.Object

val AnyRef : ClassTag[scala.AnyRef] = Manifest.AnyRef

}

object TypeTag {

val AnyRef: TypeTag[scala.AnyRef] = new PredefTypeTag[scala.AnyRef] (AnyRefTpe, _.TypeTag.AnyRef)
val Object: TypeTag[java.lang.Object] = new PredefTypeTag[java.lang.Object] (ObjectTpe, _.TypeTag.Object)

}

一些实验:
import scala.reflect.ClassTag
import scala.reflect.runtime.universe.TypeTag

println(ClassTag.AnyRef == ClassTag.Object) //true
def getClassTag[V](v: V)(implicit tag: ClassTag[V]) = tag
println(getClassTag[AnyRef](null)) //Object
println(getClassTag[Object](null)) //Object
println(getClassTag(null.asInstanceOf[AnyRef])) //Object
println(getClassTag(null.asInstanceOf[Object])) //Object
println(getClassTag(new AnyRef())) //Object
println(getClassTag(new Object())) //Object
println
println(TypeTag.AnyRef == TypeTag.Object) //false
def getTypeTag[V](v: V)(implicit tag: TypeTag[V]) = tag
println(getTypeTag[AnyRef](null)) //TypeTag[AnyRef]
println(getTypeTag[Object](null)) //TypeTag[Object]
println(getTypeTag(null.asInstanceOf[AnyRef])) //TypeTag[AnyRef]
println(getTypeTag(null.asInstanceOf[Object])) //TypeTag[Object]
println(getTypeTag(new AnyRef())) //TypeTag[Object]
println(getTypeTag(new Object())) //TypeTag[Object]
println(getTypeTag(new AnyRef().asInstanceOf[AnyRef])) //TypeTag[AnyRef]
println(getTypeTag(new AnyRef().asInstanceOf[Object])) //TypeTag[Object]
println(getTypeTag(new Object().asInstanceOf[AnyRef])) //TypeTag[AnyRef]
println(getTypeTag(new Object().asInstanceOf[Object])) //TypeTag[Object]
println
println(TypeTag.AnyRef.tpe == TypeTag.Object.tpe) //false
def getType[V](v: V)(implicit tag: TypeTag[V]) = tag.tpe
println(getType[AnyRef](null)) //AnyRef
println(getType[Object](null)) //Object
println(getType(null.asInstanceOf[AnyRef])) //AnyRef
println(getType(null.asInstanceOf[Object])) //Object
println(getType(new AnyRef())) //Object
println(getType(new Object())) //Object
println(getType(new AnyRef().asInstanceOf[AnyRef])) //AnyRef
println(getType(new AnyRef().asInstanceOf[Object])) //Object
println(getType(new Object().asInstanceOf[AnyRef])) //AnyRef
println(getType(new Object().asInstanceOf[Object])) //Object

因此,至少在某些级别的类型信息 ObjectAnyRef有所区别。它是做什么用的?或者这纯粹是一个错误?

最佳答案

你会看到任何类型别名的类似行为,我认为 Object 没有什么特别之处。/AnyRef在你上面的例子中。

scala 2.12.7> import scala.reflect.runtime.universe.TypeTag
import scala.reflect.runtime.universe.TypeTag

scala 2.12.7> class C; type D = C
defined class C
defined type alias D

scala 2.12.7> implicitly[TypeTag[C]]
res0: reflect.runtime.universe.TypeTag[C] = TypeTag[C]

scala 2.12.7> implicitly[TypeTag[D]]
res1: reflect.runtime.universe.TypeTag[D] = TypeTag[D]
CD是不同但“等效”的类型。请参阅 SLS 3.5,“类型之间的关系”( https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#relations-between-types )

关于scala - Scala 中 Object 和 AnyRef 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53435220/

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