带有Either和Option的推断列表类型

时间:2015-04-20 18:06:43

标签: scala

在Scala 2.11.6中,将EitherOption放入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)

EitherOption都延伸AnyRef,那么为什么它不是List[AnyRef]

为什么AnyRef不显示为最低上限?

另外,我期待List[Any]。为什么List[Object]出现?

2 个答案:

答案 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