你可以通過定義下面的幻像t YPE:
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
保證,對於任何兩個指定的類型,A
和B
,編譯器可以始終提供DefaultsTo[A, B]
類型的對象的定義(例如DefaultsTo[Int, String]
)。然而,如果兩種類型之一未指定(例如DefaultsTo[A, String]
),編譯器將優選識別這兩種類型(在該示例中提供DefaultsTo[String, String]
,並因此推斷出String
爲未指定類型A
)。
作爲Naftoli Gugenheim pointed out in this mailing list thread,還可以實現用一些漂亮的語法與語境範圍:
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)
請參閱[此問題](http://stackoverflow.com/questions/4403906/is-it-possible-in-scala-to-force-the-caller-to-specify-a-type-parameter-for-a相關技術。 –