你能解释一下这个微不足道的例子吗?scala类型和遗传误解
class C1 (val id: Int)
abstract class C2 [T] {
def m1 [T]
}
class C3 [C1] extends C2
{
override
def m1 (obj: C1) {
println (obj.id)
}
}
我有:值id不是类型参数C1 为什么的一员?
你能解释一下这个微不足道的例子吗?scala类型和遗传误解
class C1 (val id: Int)
abstract class C2 [T] {
def m1 [T]
}
class C3 [C1] extends C2
{
override
def m1 (obj: C1) {
println (obj.id)
}
}
我有:值id不是类型参数C1 为什么的一员?
在你的例子中有几件事情在玩。这里是修改的例子:
class C1 (val id: Int)
abstract class C2 [T] {
// don't repeat [T] and the method takes an arg
// within C2, T refers to the type parameter
def m1(t:T)
}
class C3 extends C2[C1] { // if in REPL put the brace on the same line
// no override when implementing abstract
def m1(obj:C1) { println(obj.id) }
}
这应该编译(并在REPL中运行)。
通过编写class C3[C1]
您的意思是说C3采用了一个类型参数C1
。因此在C3
的类定义中,类名C1
引用该类型参数,而不是类C1
。
你可能要写的是class C3 extends C2[C1]
(即你正在传递类C1作为C2的类型参数)。
谢谢你的建议。 我重写C3至 类C3延伸C2 [C1] { 倍率 DEF M1 [C1](OBJ:C1){ \t \t \t \t的println(obj.id) } } 但我仍然有相同的错误。 – kolchanov 2010-09-21 06:08:12
@kolchanov这是因为你做了同样的事情。如果你写了'def m1 [C1]',那么你就会说'C1'是一个类型参数 - 一些任意类型的参数将在use-site提供 - 这将会影响实际的'C1'类型。 – 2010-09-21 12:58:18
谢谢。 这正是我想要的:) – kolchanov 2010-09-21 06:42:06