如何用scala隐式解决方法委托
我怎样才能解决这个简单的问题。类转换有一个类型化方法from,它接受两个类型参数a和B,并从a返回一个B。我在同伴对象中定义了一些隐式,以提供默认beahviour 我的问题是,当我试图将调用转发到另一个类型化方法中的转换类时,该方法具有相同的签名,但它不起作用。在我的示例中,我尝试将调用从functionmyFun转发到我的转换类 我犯了以下错误如何用scala隐式解决方法委托,scala,implicit,implicits,Scala,Implicit,Implicits,我怎样才能解决这个简单的问题。类转换有一个类型化方法from,它接受两个类型参数a和B,并从a返回一个B。我在同伴对象中定义了一些隐式,以提供默认beahviour 我的问题是,当我试图将调用转发到另一个类型化方法中的转换类时,该方法具有相同的签名,但它不起作用。在我的示例中,我尝试将调用从functionmyFun转发到我的转换类 我犯了以下错误 方法的参数不足:(隐式f:A=>B) 我想知道为什么会有问题。有人能告诉我为什么以及如何克服这个问题吗 这是密码 object MyConv
- 方法的参数不足:(隐式f:A=>B)
object MyConversions {
implicit val IntToStr = (f:Int) => f.toString()
implicit val DoubleToStr = (f:Double) => f.toString()
implicit val BooleanToStr = (f:Boolean) => f.toString()
}
class Conversions{
def from[A,B](a:A)(implicit f:(A) => B) = {
f(a)
}
}
import MyConversions._;
def myFun[A,B](a:A){
// Error
new Conversions().from[A, B](a)
}
// Working
println( new Conversions().from[Int, String](3) )
问题是Scala编译器在
myFun
范围内找不到参数f:(A)=>B
的隐式值。你要做的是告诉编译器只有当有这样一个值可用时才能调用myFun
下面的代码应该可以做到这一点
对象应用程序{
可转换特征[A,B]{
def转换(a:a):B
}
可转换对象{
隐式val int2String=新的可转换[Int,String]{
覆盖def convert(a:Int):字符串=a.toString
}
隐式val float2String=新的可转换[Float,String]{
覆盖def convert(a:Float):字符串=a.toString
}
}
def myFun[A,B](A:A)(隐式转换器:可转换[A,B]):B={
convert.convert(a)
}
def main(参数:数组[字符串]):单位={
println(myFun(3))
}
}
上下文中没有隐式定义的泛型f:(A)=>B。我知道,但如何才能以正确的方式实现这一点。我认为这是一个常见的问题。我认为隐式将在源类型中查找,在这种情况下,源类型将是转换。不,在您的情况下,隐式将只在当前范围和a
和B
的伴随对象中查找。有一个问题我仍然不清楚。如何使对象可转换可扩展到其他用户,这些用户可以提供自己的隐式,而无需将具体的可转换对象传递给myFun。假设我们需要另一种将布尔值转换为字符串的方法?对于标准类型,如从布尔值
到字符串
,您必须将其添加到可转换的
伴随对象中。如果用户定义了一个新类型,比如说Foo
,并且想要定义从Foo
到String
的转换,那么他可以在Foo
的伴生对象中定义隐式可转换的[Foo,String]
,然后就会找到它。我可以问你另一个问题吗?