2012-01-29 76 views
2

我试图使用Scala 2.10.0-M1如下:类型等效问题

def bar[C <: Container](c: C)(x: C#X): c.X = x 
:使用这种形式时

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 
} 

的问题是相同的

我真的不明白为什么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 

任何想法?

+0

这是一个通常是一个设计问题,我想从路径依赖类型中检索类型。我为此创建了[另一个问题](http://stackoverflow.com/questions/9065343/exposing-a-path-dependent-type-coming-from-a-singleton-type)。 – betehess 2012-01-30 14:29:18

回答

7

C#X表示来自任何CXc.X表示来自您的特定CX,即c。后者更具体!

例如,如果X是纸币和c是一个特定客户,c.X意味着该方法只接受的纸币(为,大概)客户cC#X表示它接受来自任何客户的任何账单。如果你想确保客户只需要自己的账单(至少默认),前者是你想要的。

2

c.X and C#X绝对不一样 - 如果是的话,为什么都存在?

请考虑您有abC的不同实例的情况。根据定义,a.Xb.X是不同的,但都是C#X

3

@Rex给出了一个很好的解释。下面是如果它是合理的,能够返回xc.X类型的结果,你会如何解决这个问题?

(即在X类型作为参数传递的特定c的值,那么你可以收紧它的类型作为参数,

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

现在酒吧仅接受是相对于特定值cX类型的值。如果不适合你在酒吧的调用点工作,那么你将需要重新设计你的设计