这段代码可以编译并完全符合人们的期望
class MyList[T](list: T)(implicit o: Ordering[T])
但是,这不是:
class MyList2[T](list: T) {
val o = implicitly[Ordering[T]]
}
我不明白为什么。在第一个示例中,在构造类时,编译器将发现Ordering隐式,因为它将知道具体类型T
。但是在第二种情况下,它也应该找到隐式,因为它T
已经是一个具体类型了。
在第一个示例中,在构造类时,编译器将发现隐式的Ordering,因为它将知道具体的类型T。
在第一个示例中,一个范围需要隐式Ordering[T]
,编译器才能找到它。编译器本身不会“弥补”隐式。由于您直接需要通过第二个参数列表提供一个参数,因此,如果存在这样的隐式,它将被传递给类构造函数。
但是在第二种情况下,它也应该找到隐式,因为它
T
已经是一个具体类型了。
T
在编译时是具体类型的事实并不能帮助编译器为其找到隐式类型。当我们说T
是一个具体类型时,您必须记住,在调用站点,T
它只是一个泛型类型参数,仅此而已。如果您不帮助编译器,则无法保证在范围内具有隐式。您需要让方法提供隐式方法,这可以通过Context Bound完成:
class MyList2[T: Ordering](list: T)
这要求在编译时存在对type的排序T
。从语义上讲,这等效于第二个参数列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句