我偶然发现了一种奇怪的情况,即在似乎更合适的地方推断出reflect.runtime.universe._
进口原因。reflect.runtime.universe.RuntimeClass
Nothing
考虑这个简单的方法和List
:
import scala.reflect.ClassTag
def find[A : ClassTag](l: List[Any]): Option[A] =
l collectFirst { case a: A => a }
val list = List(1, "a", false)
我可以使用它来查找某种类型的第一个元素List
,并且效果很好,正如预期的那样。
scala> find[String](list)
res1: Option[String] = Some(a)
scala> find[Long](list)
res2: Option[Long] = None
如果我不提供类型参数,则A
推断为Nothing
,所以我得到Option[Nothing]
,也如预期的那样。
scala> find(list)
res3: Option[Nothing] = None
但是,如果我import scala.reflect.runtime.universe._
再次不提供类型参数,A
现在推断为reflect.runtime.universe.RuntimeClass
而不是Nothing
.
scala> find(list)
res4: Option[reflect.runtime.universe.RuntimeClass] = None
^ What?
这不是一个大问题,因为如果不find
手动提供类型参数,我几乎无法想象该方法的很多用例,但为什么会发生这种情况呢?似乎部分归咎于,因为ClassTag
再次删除它会导致Nothing
推断(尽管由于擦除而完全破坏了该方法)。这里发生了什么?