10

我最近发现可以使用Pimp Enrich My Library 模式向伴随对象添加方法.type

object Whatever { }

implicit class WhateverExtensions(val obj: Whatever.type) {
    def greet = println("Hi!")
}

Whatever.greet

不幸的是,这似乎不适用于包对象,例如scala.math

implicit class MathExtensions(val obj: scala.math.type) {
    def min(x: Money, y: Money): Money = ???
}

我收到以下编译器错误:

错误:(153, 47) 类型不匹配;
 找到:math.type
 必需:AnyRef
请注意,数学扩展了 Any,而不是 AnyRef。
此类类型可以参与值类,但实例
不能出现在单例类型或参考比较中。
    隐式类 MathExtensions(val obj: scala.math.type) 扩展 AnyVal {
                                                 ^

是否可以丰富一个包对象?

4

1 回答 1

9

我认为以这种方式不可能,尽管文档非常薄。编译器显然对它的处理方式与单例不同。即使编译了该方法,import scala.math._肯定不会导入您的min方法,因为没有什么可以触发隐式转换。好吧,如果math.customMin可能的话,那将需要两次进口。

以另一种方式可能的。我们可以在scala.math包中定义任何我们想要的东西。但是,我们不能在顶层定义方法,所以我们需要使用一些对象技巧来使其工作。

package scala.math

object intMin extends ((Int, Int) => Int) {
    def apply(x: Int, y: Int): Int = x + y
}

一些测试:

import scala.math._

object Test extends App {

    println(intMin(4, 10))

}
于 2015-05-20T01:00:11.497 回答