使用依赖方法类型和类型投影时,键入等效问题

时间:2012-01-29 23:44:04

标签: scala path-dependent-type dependent-method-type

我正在使用Scala 2.10.0-M1尝试以下内容:

trait Container {
  type X
}

class Test[C <: Container](val c: C) {
  def foo(x: c.X): C#X = x // this compiles fine
  def bar(x: C#X): c.X = x // this does not compile
}

使用此表单时问题相同:

def bar[C <: Container](c: C)(x: C#X): c.X = x

我真的不明白为什么foo会编译而bar没有。

我认为此处c.XC#X应该相同。

另外,我不明白错误信息:

[error]  found   : x.type (with underlying type C#X)
[error]  required: Test.this.c.X
[error]  possible cause: missing arguments for method or constructor
[error]   def bar(x: C#X): c.X = x // this does not compile

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

C#X表示来自任何X的{​​{1}}。 C表示来自特定c.X的{​​{1}},即X。后者更具体!

例如,如果C是帐单而c是特定客户,则X表示该方法仅接受来自(可能是)客户c的帐单。 c.X表示它接受来自任何客户的任何账单。如果您想确保客户只收取自己的账单(至少在默认情况下),前者就是您想要的。

答案 1 :(得分:3)

@Rex已经对错误做了很好的解释。以下是您可以解决的问题......

如果由于类型x而返回c.X是合理的(即,X类型的特定c类型的值作为参数,然后你可以收紧它的类型作为参数,

def bar[C <: Container](c: C)(x: c.X): c.X = x

现在,bar只接受X类型的值,这些值与特定值c相关。如果这在酒吧的呼叫站点不起作用,那么您将需要重新设计您的设计。

答案 2 :(得分:2)

c.XC#X绝对不一样 - 如果是,为什么两者都存在?

考虑一下ab C的不同实例的情况。根据定义,a.Xb.X不同,但都是C#X