如何确保函数接收与当前对象相同的参数类型?
How do I make sure a function receives the same parameter type as the current object?
abstract class A {
protected[this] type ThisType = this.type
protected[this] type OtherType = this.type
def assign(other: OtherType): ThisType
}
class B extends A {
def assign(other: OtherType): ThisType = ???
}
class C extends A {
def assign(other: OtherType): ThisType = ???
}
class D extends C {
def assign(other: OtherType): ThisType = ???
}
如何确保在类型 B
的 assign
中接收到的其他类型和对象也是 B
。例如我怎样才能像这样有效地写一些东西:
def f1(p1: A, p2: A) = p1.assign(p2)
def f2[T <: A](p1: T, p2: T) = p1.assign(p2)
我收到以下错误:
注意:实际上 ThisType
和 OtherType
应该是相同的,但我将它们分开以便尝试不同的选项。
可以使用 Type Projections:
实现您想要的一种方法
def main(args: Array[String]): T = {
f1(new C, new C)
}
abstract class A {
type ThisType <: A
def assign(other: ThisType): ThisType
}
class C extends A {
override type ThisType = C
override def assign(other: C): C = ???
}
class D extends C {
override type ThisType = D
override def assign(other: D): D = ???
}
def f1[T <: A](p1: T#ThisType, p2: T#ThisType) = p1.assign(p2)
另一种方法可以使用 F-bound polymorphism:
abstract class A[T <: A[T]] {
def assign(other: T): T
}
class C extends A[C] {
override def assign(other: C): T = ???
}
def f1[T <: A[T]](p1: T, p2: T) = p1.assign(p2)
abstract class A {
protected[this] type ThisType = this.type
protected[this] type OtherType = this.type
def assign(other: OtherType): ThisType
}
class B extends A {
def assign(other: OtherType): ThisType = ???
}
class C extends A {
def assign(other: OtherType): ThisType = ???
}
class D extends C {
def assign(other: OtherType): ThisType = ???
}
如何确保在类型 B
的 assign
中接收到的其他类型和对象也是 B
。例如我怎样才能像这样有效地写一些东西:
def f1(p1: A, p2: A) = p1.assign(p2)
def f2[T <: A](p1: T, p2: T) = p1.assign(p2)
我收到以下错误:
注意:实际上 ThisType
和 OtherType
应该是相同的,但我将它们分开以便尝试不同的选项。
可以使用 Type Projections:
实现您想要的一种方法def main(args: Array[String]): T = {
f1(new C, new C)
}
abstract class A {
type ThisType <: A
def assign(other: ThisType): ThisType
}
class C extends A {
override type ThisType = C
override def assign(other: C): C = ???
}
class D extends C {
override type ThisType = D
override def assign(other: D): D = ???
}
def f1[T <: A](p1: T#ThisType, p2: T#ThisType) = p1.assign(p2)
另一种方法可以使用 F-bound polymorphism:
abstract class A[T <: A[T]] {
def assign(other: T): T
}
class C extends A[C] {
override def assign(other: C): T = ???
}
def f1[T <: A[T]](p1: T, p2: T) = p1.assign(p2)