方法调用的默认类型

时间:2011-07-08 18:34:41

标签: generics scala types type-parameter

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

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

当编译器没有关于要推断的类型的提示时,我希望AString。所以我可以用以下内容重载我的定义:

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

但是这两种方法在擦除后都会有相同的签名...有没有办法提供默认类型?

2 个答案:

答案 0 :(得分:7)

您可以通过定义以下幻像类型来实现此目的:

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 )

overrideDefault的定义保证对于任何两种指定类型AB,编译器总是可以提供类型为DefaultsTo[A, B]的对象(例如{{1} }})。但是,如果两种类型中的一种未指定(例如DefaultsTo[Int, String]),编译器将更愿意识别这两种类型(在示例中提供DefaultsTo[A, String],从而推断DefaultsTo[String, String]未指定的类型String)。

作为Naftoli Gugenheim pointed out in this mailing list thread,您还可以使用一些很好的语法来与上下文边界一起使用:

A

答案 1 :(得分:0)

在这种情况下,你可以使用一个小技巧

class C {
   def apply[A](id: String) = (processor: Processor[A]) => id + processor
   def apply(id: String)(implicit processor: Processor[String]) = id + processor
}

在更一般的背景下,不知道sry ......

修改

我忘了您需要processorimplicit所以它不会编译......