Scala内部类型为抽象方法参数
在一些需要内部特征/类的子类化的代码中,我无法成功实现抽象方法,显然是因为我的类型签名不匹配。 例如:
trait Outer {
trait Inner
def score(i:Inner): Double
}
class Outer2 extends Outer {
class Inner extends super.Inner
def score(i:Inner) = 0.0
}
您可能会想象Outer2.score
未成功实现Outer.score
因为Outer2.this.Inner
类型与Outer.this.Inner
不匹配。 但是来自scala-2.9.0.1的编译错误消息并不表示这一点。 它说:
error: class Outer2 needs to be abstract, since method score in trait Outer
of type (i: Outer2.this.Inner)Double is not defined
(Note that Outer.this.Inner does not match Outer2.this.Inner)
它表示它期待Outer2.this.Inner
类型的参数! 这实际上正是我想要的行为。 但为什么我的第二个score
定义不能成功匹配抽象方法的类型?
我尝试使用以下替代代码更清楚地编译编译器,但是我也得到了类似的错误消息。
trait Outer[This<:Outer[This]] {
this: This =>
trait Inner
def score(i:This#Inner): Double
}
class Outer2 extends Outer[Outer2] {
class Inner extends super.Inner
def score(i:Outer2#Inner) = 0.0
}
您无法在重写方法中细化方法参数的类型。
这工作:
class Outer2 extends Outer {
def score(i: super[Outer].Inner) = 0.0
// Or just:
// def score(i: super.Inner) = 0
}
考虑一下编译器是否允许你的代码:
trait Outer {
trait Inner
def score(i:Inner): Double
}
class Outer2 extends Outer {
class Inner extends super.Inner { def foo = "!" }
def score(i:Inner) = { i.foo; 0.0 }
// !!! unsafe, no `foo` method
score(new super[Outer].Inner{})
}
重写方法可能有更具体的返回类型,因为这不会导致不健全的代码。 (在JVM级别,返回类型包含在方法签名中,创建Bridge方法以允许调用者根据超类中的签名进行编程并分派给子类中的实现。)
这可能是一个合适的解决方法,具体要求取决于:
trait Outer {
trait InnerI
type Inner <: InnerI
def score(i:Inner): Double
}
class Outer2 extends Outer {
class InnerI extends super.InnerI
type Inner = InnerI
def score(i:Inner) = 0.0
}
链接地址: http://www.djcxy.com/p/66205.html