【发布时间】:2015-09-09 04:58:26
【问题描述】:
我正在尝试使用 scala 类型类,但遇到了以下问题。我创建了一个具有多种方法的类。每个方法都有一个隐式参数 B 并返回一个 Either[A,B]。
B 类型是一个转换器,调用者可以在其中提供自定义对象以按照他需要的方式包装响应。
这里是代码
case class A( var value:String){
}
case class Converter[A]( value : (Map[String, String] ) => A )
object Converter{
implicit val AConverter = new Converter[A]( (x:Map[String, String]) => new A("Hello World") )
implicit val IntConverter = new Converter[Int]( (x:Map[String, String]) => 10 )
}
class API{
def method1[B : Converter] : Either[A, B] = {
Right( implicitly[Converter[B]].value(Map.empty))
}
def method2[B : Converter](name:String) : Either[A, B] = {
Right( implicitly[Converter[B]].value(Map.empty))
}
def method3[B : Converter](id:Int) : Either[A, B] = {
Right( implicitly[Converter[B]].value(Map.empty))
}
}
现在我的麻烦来了。我想归档关注
每个方法都应该是可调用的,而不用担心隐式参数 B 因为应该在某处定义一个默认实现。
所以我在伴生对象中定义了一些隐式,但这根本不能解决我的问题!
// Works due implicit definiton
println( new API().method1[A])
// Works due implicit definiton
println( new API().method1[Int])
// Works not but should
println( new API().method1)
我想说method1的B类型是Converter[A],method2的B类型是 Converter[Int] 如果调用者没有提供它。
// Implementation should use my default Converter[A]
println( new API().method1)
我在这里遇到了这个问题
https://stackoverflow.com/a/29205892/452265
如果类型本身没有像示例中那样传递给方法,那么我如何提供默认类型。我需要每个方法而不是每个类。
【问题讨论】:
-
所以你想要一个默认类型参数?今天已经有人问过这个问题,答案已经在 SO 上。
-
这是我发布的同一个链接,但这并不能解决我的问题:)
-
为什么它不能解决你的问题?如果未提供默认类型,您是否希望提供默认类型?正确的?无论是类还是方法都没有关系。您可以在类级别或方法级别进行类型参数化。
-
因为在那种情况下,人们会尝试初始化一个本地 var p:T,我想说如果没有给出隐式类型 B 应该是 Converter[一个]。看看代码不一样!
标签: scala generics type-inference