我有一个图书馆的类(class)(特别是 com.twitter.finagle.mdns.MDNSResolver
)。我想扩展这个类(我希望它返回一个 Future[Set],而不是一个 Try[Group])。
当然,我知道我可以对它进行子类化并在那里添加我的方法。但是,我正在努力学习 Scala,这似乎是一个尝试新事物的机会。
我认为这可能的原因是 JavaConverters
的行为.以下代码:
class Test {
var lst:Buffer[Nothing] = (new java.util.ArrayList()).asScala
}
不编译,因为没有
asScala
Java 的 ArrayList
上的方法.但是,如果我导入一些新定义:class Test {
import collection.JavaConverters._
var lst:Buffer[Nothing] = (new java.util.ArrayList()).asScala
}
然后突然有一个
asScala
方法。所以看起来像 ArrayList
类正在被透明地扩展。我了解
JavaConverters
的行为吗?正确吗?我可以(并且应该)复制该方法吗?
最佳答案
Scala 支持一种叫做隐式转换的东西。请看以下内容:
val x: Int = 1
val y: String = x
第二个分配不起作用,因为
String
是预期的,但 Int
被发现。但是,如果您将以下内容添加到范围内(只是在范围内,可以来自 任何地方 ),它可以工作:implicit def int2String(x: Int): String = "asdf"
请注意,方法的名称无关紧要。
所以通常所做的,称为 pimp-my-library-pattern:
class BetterFoo(x: Foo) {
def coolMethod() = { ... }
}
implicit def foo2Better(x: Foo) = new BetterFoo(x)
这使您可以调用
coolMethod
在 Foo
.这经常被使用,从 Scala 2.10 开始,你可以这样写:implicit class BetterFoo(x: Foo) {
def coolMethod() = { ... }
}
它做同样的事情,但显然更短更好。
所以你可以这样做:
implicit class MyMDNSResolver(x: com.twitter.finagle.mdns.MDNSResolver) = {
def awesomeMethod = { ... }
}
您可以调用
awesomeMethod
在任何 MDNSResolver
, 如果 MyMDNSResolver
是在范围内。
关于scala - 如何向库对象添加新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072184/