加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 从返回类型中推断通用隐式参数的类型

发布时间:2020-12-16 09:25:05 所属栏目:安全 来源:网络整理
导读:说我有一个像这样的简单类 abstract class Foo { implicit val impInt: Int = 42 def f[A]()(implicit a: A): A val f2: Int = f()} 当声明val f2时,编译器能够推断函数f的隐式参数的类型是Int,因为该类型与结果类型相同,并且结果类型需要匹配值f2的类型,即I
说我有一个像这样的简单类

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()

导致此编译错误:

Ambiguous implicit values: both value StringCanBuildFrom in object Predef of type => scala.collection.generic.CanBuildFrom[String,Char,String] and method $conforms in object Predef of type [A]=> <:<[A,A] match expected type A

如果我在调用f()时添加类型信息,它会编译:

val f2: Int = f[Int]()

首先我遇到了隐式排序的情况,我认为它与Scala从左到右推断有关;我认为它不能首先匹配返回类型,然后推断f的(隐式)参数类型.但后来我尝试了没有隐式排序的情况,看到它有效 – 它推断出f必须由Int参数化,因为返回类型必须是Int(因为f2是Int).

请注意,如果我们删除隐式a:A并仅保留Ordering隐式参数,则错误仍然存??在,但变为

Diverging implicit expansion for type Ordering[A] starting with method Tuple9 in object 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()
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读