在Scala 2.11.6中,将Either
和Option
放入List会导致推断类型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]
出现?
答案 0 :(得分:6)
如果在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
而你得到了它。
quote and diagram的来源。
答案 1 :(得分:2)
这是AnyRef
的列表。 AnyRef
对应java.lang.Object
。来自here:
如果在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