推断列表类型与任一和选项
在Scala 2.11.6中,将一个Either
和一个Option
放入列表中会导致推断的类型List[Object]
:
scala> val e: Either[String, Int] = Right(100)
e: Either[String,Int] = Right(100)
scala> val o: Option[Int] = None
o: Option[Int] = None
scala> List(e, o)
res0: List[Object] = List(Right(100), None)
Either
和Option
都扩展AnyRef
,那么为什么它不是一个List[AnyRef]
?
为什么AnyRef
不显示为最小上限?
此外,我期待List[Any]
。 为什么List[Object]
出现?
如果在Java运行时环境中使用Scala,则scala.AnyRef对应于java.lang.Object。
scala> val x: List[AnyRef] = List(e, o)
x: List[AnyRef] = List(Right(100), None)
scala> val x: List[java.lang.Object] = List(e, o)
x: List[Object] = List(Right(100), None)
你期望的最低上限AnyRef
,你明白了。 报价和图表的来源。
它是AnyRef
的列表。 AnyRef
对应于java.lang.Object
。 从这里:
如果在Java运行时环境中使用Scala,则scala.AnyRef对应于java.lang.Object。
你可以用反射来展示:
import scala.reflect.runtime.universe._
scala> lub(List(typeOf[Either[String, Int]], typeOf[Option[Int]]))
res43: reflect.runtime.universe.Type = Object
scala> typeOf[AnyRef] =:= typeOf[java.lang.Object]
res44: Boolean = true
scala> typeOf[AnyRef] =:= typeOf[Any]
res45: Boolean = false
链接地址: http://www.djcxy.com/p/38021.html