Generics 方法调用的默认类型

Generics 方法调用的默认类型,generics,scala,types,type-parameter,Generics,Scala,Types,Type Parameter,我想知道在Scala中调用类型参数化方法时,是否可以使用默认类型。假设我在某处有以下方法: def apply[A]( id: String )( implicit processor: Processor[A] ) = processor( data get id ) 我希望A是String,而编译器没有关于推断哪种类型的提示。因此,我可以用以下内容重载我的定义: def apply( id: String )( implicit processor: Processor[String]

我想知道在Scala中调用类型参数化方法时,是否可以使用默认类型。假设我在某处有以下方法:

def apply[A]( id: String )( implicit processor: Processor[A] ) =
  processor( data get id )
我希望
A
String
,而编译器没有关于推断哪种类型的提示。因此,我可以用以下内容重载我的定义:

def apply( id: String )( implicit processor: Processor[String] ) =
  processor( data get id )

但两种方法在擦除后将具有相同的签名。。。有没有办法提供默认类型?

在这种情况下,您可以使用一些小技巧

class C {
   def apply[A](id: String) = (processor: Processor[A]) => id + processor
   def apply(id: String)(implicit processor: Processor[String]) = id + processor
}
在更一般的情况下,不知道sry

编辑


我忘了您需要
处理器
隐式的
,这样它就不会编译…

您可以通过定义以下幻影类型来实现这一点:

sealed class DefaultsTo[A, B]
trait LowPriorityDefaultsTo {
   implicit def overrideDefault[A,B] = new DefaultsTo[A,B]
}
object DefaultsTo extends LowPriorityDefaultsTo {
   implicit def default[B] = new DefaultsTo[B, B]
}
然后你的方法就可以写出来了

def apply[A]( id: String )( implicit e: A DefaultsTo String,
                                     processor: Processor[A] ) =
   processor( data get id )
overridedfault
的定义保证,对于任何两种指定类型,
A
B
,编译器始终可以提供类型为
DefaultsTo[A,B]
(例如
DefaultsTo[Int,String]
)的对象。但是,如果两种类型中有一种未指定(例如,
DefaultsTo[A,String]
),编译器将倾向于识别这两种类型(在示例中,提供
DefaultsTo[String,String]
,从而推断未指定类型的
A

同样,您还可以实现一些用于上下文边界的漂亮语法:

class Has[B] {
   type AsDefault[A] = A DefaultsTo B
}

def apply[A : Has[String]#AsDefault : Processor](id: String) =
   implicitly[Processor[A]].apply(data get id)

如果他希望编译器隐式地提供处理器,那么这是行不通的。有关相关技术,请参阅。