【问题标题】:How to use implicitly to find a conversion to a type with a method name?如何隐式使用方法名称来查找到类型的转换?
【发布时间】:2012-12-07 17:08:57
【问题描述】:

在另一个答案here 中,他们给出了以下代码示例:

scala> implicitly[Int => { def min(i: Int): Any }]
res22: (Int) => AnyRef{def min(i: Int): Any} = <function1>

这在我的 scala 控制台 (2.10.0-RC2) 中不起作用。

scala> implicitly[Int => { def min(i: Int): Any }]
<console>:8: error: No implicit view available from Int => AnyRef{def min(i: Int): Any}.
          implicitly[Int => { def min(i: Int): Any }]
                    ^
scala> 12 min 11
res15: Int = 11

有什么新方法?无论如何,这种语法是什么意思?我不熟悉它——特别是{ def min(i: Int): Any } 部分,用作类型表达式。这是定义某种匿名类型吗?

我想这样做是因为当我在代码中看到隐式转换并且不知道它是从哪里导入时,我想追踪它。例如,前几天我看到一些在java.util.Date 上调用format 的代码,它没有format。我不知道转换中拉入了哪个进口。

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    您不会找到min,因为RichInt 现在是一个值类(它不适用于结构类型——它必须是AnyRef)。

    但该策略将起作用:

    scala> implicitly[Option[Int] => { def iterator: Iterator[Int] }]
    res29: Option[Int] => AnyRef{def iterator: Iterator[Int]} = <function1>
    

    所以同样的技巧也能奏效,只是不适用于值类。请改用 IDE。

    【讨论】:

    • 我并没有真正跟上关于 Scala 2.10(以及,通过扩展,值类)的工会状态,所以我不知道这有什么关系,但是,因为它事实证明,结构类型的目标必须是 AnyRef 的说法实际上是不正确的——至少在 2.9.x 中不是。一个简单的反例:def anyValToString[T &lt;: AnyVal { def toString: String }](t: T) : String = t.toString。正如此处的类型所暗示的那样,此方法仅适用于 AnyVals 作为输入。
    • @Destin - 有趣。前值类,所有(非专业)泛型实际上都是 Objects,即使您使用的是盒装的 AnyVal 版本,所以允许结构类型是有意义的。我想您也可以将值类装箱;我想知道为什么没有这样做?
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多