gpt4 book ai didi

generics - 方法调用的默认类型

转载 作者:行者123 更新时间:2023-12-02 19:22:36 24 4
gpt4 key购买 nike

我想知道在 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 )

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

最佳答案

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

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](例如 DefaultsTo[Int, String])。但是,如果未指定这两种类型中的一种(例如 DefaultsTo[A, String]),编译器将更倾向于识别这两种类型(在示例中提供 DefaultsTo[String, String],从而推断出未指定类型 AString)。

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)

关于generics - 方法调用的默认类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6628849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com