通过方法/构造函数参数隐式与隐式使用

西蒙·马丁斯

这段代码可以编译并完全符合人们的期望

class MyList[T](list: T)(implicit o: Ordering[T])

但是,这不是:

class MyList2[T](list: T) {
  val o = implicitly[Ordering[T]]
}

我不明白为什么。在第一个示例中,在构造类时,编译器将发现Ordering隐式,因为它将知道具体类型T但是在第二种情况下,它也应该找到隐式,因为它T已经是一个具体类型了。

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

在第一个示例中,在构造类时,编译器将发现隐式的Ordering,因为它将知道具体的类型T。

在第一个示例中,一个范围需要隐式Ordering[T],编译器才能找到它。编译器本身不会“弥补”隐式。由于您直接需要通过第二个参数列表提供一个参数,因此,如果存在这样的隐式,它将被传递给类构造函数。

但是在第二种情况下,它也应该找到隐式,因为它T已经是一个具体类型了。

T在编译时是具体类型的事实并不能帮助编译器为其找到隐式类型。当我们说T是一个具体类型时,您必须记住,在调用站点,T它只是一个泛型类型参数,仅此而已。如果您不帮助编译器,则无法保证在范围内具有隐式。您需要让方法提供隐式方法,这可以通过Context Bound完成

class MyList2[T: Ordering](list: T)

这要求在编译时存在对type的排序T从语义上讲,这等效于第二个参数列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章