首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Scala在这种特殊情况下找不到次要的隐式值?

为什么Scala在这种特殊情况下找不到次要的隐式值?
EN

Stack Overflow用户
提问于 2012-02-04 04:07:23
回答 2查看 231关注 0票数 8

我很难解释主隐值或隐式转换所寻求的附加隐值之间的行为差异。具体而言,这起作用是:

代码语言:javascript
复制
trait Foo[A]
implicit def fooString: Foo[String] = null

implicit def value[A](implicit foo: Foo[A]) = 5

> implicitly[Int]
5

但这并不意味着:

代码语言:javascript
复制
implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new {
    def aMethod = 5
}

> 1.aMethod
could not find implicit value for parameter foo: test.Foo[A]

变化:

  • 无论搜索是由implicitly启动还是隐式转换
  • 所追求的次要隐值是否为多态
  • 提供的次要隐式值是否为多态值。

我得到以下结果:

代码语言:javascript
复制
Conversion/value  Searching for  Supplied | Works?
----------------  -------------  -------- | ------
     conversion     poly          poly    |  yes
     conversion     poly          mono    |  **no**
     conversion     mono          poly    |  yes
     conversion     mono          mono    |  yes
     value          poly          poly    |  yes
     value          poly          mono    |  yes
     value          mono          poly    |  yes
     value          mono          mono    |  yes

正如您所看到的,唯一不起作用的情况是,当搜索通过隐式转换开始时,所寻求的值是多态的,但是所提供的值是单形的。

是否有一个理论上的原因应该是这种情况,或这是一个缺陷/限制的Scala?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-04 14:11:16

你被飞刀虫西-3346咬了。更一般地看四四六九九的描述(尤指)。第(1)点

1)隐式搜索和隐式转换搜索对未确定的类型参数有不同的处理。

你直接观察到你的案例区分了隐式值和隐式转换。

我已经更新了SI-3346,将此作为另一个示例。

票数 7
EN

Stack Overflow用户

发布于 2012-02-04 11:10:23

以下列方式更改隐式转换的签名:

代码语言:javascript
复制
implicit def conversion[A](a: A)(implicit foo: Foo[A]) = new {

然后对定义了隐式值的类型的值(即使用字符串)调用aMethod。

代码语言:javascript
复制
scala> "foo".aMethod
res0: Int = 5
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9138312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档