我想定义一个类继承层次结构,因此参数化方法的参数类型介于我的第一个基类和当前基类之间:
class A {
var x;
}
class B(parent:A = null) extends A {
var y;
protected def method[/* T where, T is subclass of A but super class of type.this */](param:T):Unit = {}
}
class C(parent:B = null) extends B {
var z
protected override def method[/* T where, T is subclass of A but super class of type.this */](param:T):Unit = {}
}
这可能吗?是否有任何理由我不应该尝试实现这一点(架构原因或任何其他原因)?
答案 0 :(得分:7)
您可以使用>: this.type
类型绑定:
class A
class B extends A
class C extends B { def method[T >: this.type <: A](a: T) = a }
class D extends C
因此,您无法使用类型参数C
调用D
上的方法:
scala> new C().method[D](new D)
<console>:12: error: type arguments [D] do not conform to method method's type parameter bounds [T >: C <: A]
new C().method[D](new D)
^
但您可以在D
上使用D
类型参数调用它:
scala> new D().method[D](new D)
res0: D = D@49df83b5
请注意,D
的任何实例也是C
的实例,因此new C().method(new D)
(没有类型参数)将编译为new C().method[C](new D)
。