【问题标题】:Inferred List Type with Either and Option带有 Either 和 Option 的推断列表类型
【发布时间】:2015-06-27 14:40:09
【问题描述】:

在 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]会出现?

【问题讨论】:

    标签: scala


    【解决方案1】:

    如果在 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的来源。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2011-11-22
        • 2014-08-31
        • 2017-06-29
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        相关资源
        最近更新 更多