I'm trying the following with 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
}
The problem is the same when using this form:
def bar[C <: Container](c: C)(x: C#X): c.X = x
I don't really see why foo
compiles while bar
does not.
I believe that c.X
and C#X
should be the same here.
Also, I don't understand the error message:
[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
Any idea?
C#X
means anX
from anyC
.c.X
means anX
from your particularC
, namelyc
. The latter is much more specific!For example, if
X
is a bill andc
is a particular customer,c.X
means that the method only accepts bills from (for, presumably) customerc
.C#X
means it accepts any bill from any customer. If you want to ensure that customers only get charged with their own bills (at least by default), the former is what you want.