我有一个抽象的Scala类
以下是我目前想到的解决方案。
这会产生以下编译错误:
这个错误信息让我感到困惑,因为在这个情况下我认为
Base
,它有子类Derived1
和Derived2
。 Base
定义了一个函数f(),它返回与实现类相同类型的对象。因此,Derived1.f()
返回Derived1
,Derived2.f()
返回Derived2
。我该如何在Scala中编写这个代码?以下是我目前想到的解决方案。
package com.github.wpm.cancan
abstract class Base {
def f[C <: Base]: C
}
case class Derived1(x: Int) extends Base {
def f[Derived1] = Derived1(x + 1)
}
case class Derived2(x: Int) extends Base {
def f[Derived2] = Derived2(x + 2)
}
这会产生以下编译错误:
type mismatch;
[error] found : com.github.wpm.cancan.Derived1
[error] required: Derived1
[error] def f[Derived1] = Derived1(x + 1)
type mismatch;
[error] found : com.github.wpm.cancan.Derived2
[error] required: Derived2
[error] def f[Derived2] = Derived2(x + 2)
这个错误信息让我感到困惑,因为在这个情况下我认为
com.github.wpm.cancan.Derived1
应该与Derived1
相同。
def f[Derived1]
中,Derived1
不是指向case class Derived1
的引用,而是作为def f ...
的类型参数! - Randall Schulz