gpt4 book ai didi

scala - 如何在 Scala 中为更高级的类型使用通配符?

转载 作者:行者123 更新时间:2023-12-04 11:44:29 25 4
gpt4 key购买 nike

假设我有这个特质

trait Ctx[C, V[_]]

我无法构造任何采用 Ctx 的方法签名,其中第二个类型参数未指定(通配符)。例如。这个:
def test(c: Ctx[_, _]) = ()

不编译( "error: _$2 takes no type parameters, expected: one" )。我也做不到
def test(c: Ctx[_, _[_]]) = ()

( "error: _$2 does not take type parameters" )。我错过了什么?

最佳答案

我能够定义这个:

def test[V[X]](c:Ctx[_,V]) {}

它似乎适用于类型推断:
scala> trait Ctx[ C, V[ _ ]]
defined trait Ctx

scala> def test[V[X]](c:Ctx[_,V]) {}
test: [V[X]](c: Ctx[_, V])Unit

scala> class P extends Ctx[Int, List]
defined class P

scala> new P
res0: P = P@1f49969

scala> test(res0)

编辑 : 我怀疑替换 Ctx 不切实际使用抽象类型,但这是我能够做的:
trait Ctx[C] { type V[X] }
class CtxOption[C] extends Ctx[C] { type V[X] = Option[X] }
class CtxList[C] extends Ctx[C] { type V[X] = List[X] }

def test(ctx:Ctx[_]) { println(ctx) }

val ctxOptInt = new CtxOption[Int]
val ctxListStr = new CtxList[String]

test(ctxOptInt)
test(ctxListStr)

val list = collection.mutable.ListBuffer[Ctx[_]]()
list += ctxOptInt
list += ctxListStr
list

为 V 使用抽象类型可以免去为通配符类型构造函数计算类型参数语法的复杂(或不可能)任务。此外,如 ListBuffer 示例中所示,您可以在 V 处处理对象。是不同类型的构造函数(在我的示例中为 Option 和 List )。我提供的第一个解决方案不允许您这样做。

编辑 2 : 怎么样?
trait AbstractCtx[C] { type W[X] }
trait Ctx[C,V[_]] extends AbstractCtx[C] { type W[X] = V[X] }
def test(ctx:AbstractCtx[_]) { println(ctx) }

关于scala - 如何在 Scala 中为更高级的类型使用通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237644/

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