我偶然发现了一种奇怪的情况,即在似乎更合适的地方推断出reflect.runtime.universe._进口原因。reflect.runtime.universe.RuntimeClassNothing
考虑这个简单的方法和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推断(尽管由于擦除而完全破坏了该方法)。这里发生了什么?