如何在 Scala 中对更高种类的类型使用通配符?
假设我有这个特征,
trait Ctx[C, V[_]]
我无法构造任何采用未指定第二个类型参数(通配符)的 Ctx 的方法签名。例如:
def test(c: Ctx[_, _]) = ()
无法编译(“错误:_$2 不接受类型参数,预期:一个”
)。我也不能这样做
def test(c: Ctx[_, _[_]]) = ()
(“错误:_$2 不接受类型参数”
)。我缺少什么?
Let's say I have this trait
trait Ctx[C, V[_]]
I am unable to construct any method signature that takes a Ctx of which the second type parameter is unspecified (wildcard). E.g. this:
def test(c: Ctx[_, _]) = ()
doesn't compile ("error: _$2 takes no type parameters, expected: one"
). Neither can I do
def test(c: Ctx[_, _[_]]) = ()
("error: _$2 does not take type parameters"
). What am I missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我能够定义这个:
并且它似乎可以与类型推断一起使用:
编辑:我怀疑替换
Ctx
以使用抽象是不切实际的类型,但这就是我能够做的:使用 V 的抽象类型可以让您免去计算通配符类型构造函数的类型参数语法的复杂(或不可能)任务。此外,如 ListBuffer 示例所示,您可以处理其中
V
是不同类型构造函数的对象(Option 和 List em> 在我的例子中)。我提供的第一个解决方案不允许您这样做。编辑2:怎么样?
I'm able to define this one:
And it seems to work ok with type inference:
Edit: I suspect it won't be practical to replace
Ctx
to use an abstract type, but this is what I was able to do:Using an abstract type for V spares you the complicated (or impossible) task of figuring the type parameter syntax for a wildcard type constructor. Additionally as demonstrated in the ListBuffer example you can then handle objects where the
V
is a different type constructor (Option and List in my example). The first solution I provided would not allow you to do that.Edit 2: How about?
您需要为
Ctx
的第二个参数传递类型构造函数。如果您只传递_
,Scala 无法推断出正确的类型。也不可能使用通配符定义类型构造函数(即_[_]]
。请注意,在第一个示例中,错误消息中的_$2
指的是作为整体作为第二个参数传递给Ctx
的类型,但在第二个示例中,_$2
指的是_[_]
以下内容有效,因为此处的
V
是Ctx
所期望的正确类型的类型构造函数。You need to pass a type constructor for the second argument of
Ctx
. Scala is not able to infer the correct kind if you just pass_
. Neither is it possible to define a type constructor with wildcards (i.e._[_]]
on the fly. Note that in your first example_$2
in the error message refers to the type passed as second argument toCtx
as a whole. In the second example however_$2
refers to the the first wildcard type in_[_]
. See the location indicator in the error messages:The following works since here
V
is a type constructor of the right kind expected byCtx
.