scala – 从返回类型中推断通用隐式参数的类型
说我有一个像这样的简单类
abstract class Foo { implicit val impInt: Int = 42 def f[A]()(implicit a: A): A val f2: Int = f() } 当声明val f2时,编译器能够推断函数f的隐式参数的类型是Int,因为该类型与结果类型相同,并且结果类型需要匹配值f2的类型,即Int. 但是,将订购[A]投入混合: def f[A]()(implicit a: A,m: Ordering[A]): A val f2: Int = f() 导致此编译错误:
如果我在调用f()时添加类型信息,它会编译: val f2: Int = f[Int]() 首先我遇到了隐式排序的情况,我认为它与Scala从左到右推断有关;我认为它不能首先匹配返回类型,然后推断f的(隐式)参数类型.但后来我尝试了没有隐式排序的情况,看到它有效 – 它推断出f必须由Int参数化,因为返回类型必须是Int(因为f2是Int). 请注意,如果我们删除隐式a:A并仅保留Ordering隐式参数,则错误仍然存??在,但变为
再次,添加类型参数,使其变为val f2:Int = f [Int]()有帮助. 这是怎么回事?为什么编译器可以推断出参数A必须是Int,而不是那个参数Ordering [A]必须是Ordering [Int]? 解决方法
生成排序实例的方式肯定有问题,因为下面的代码可以正常工作.我报告了一个错误.
case object types { implicit def buh[X]: List[X] = List() } abstract class Foo { import types._ def f[A]()(implicit l: List[A]): A val f2: Int = f() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |