【发布时间】:2021-04-14 00:14:58
【问题描述】:
使用 Scala 已经有一段时间了,希望能够使用类型约束进行域建模。在下面的代码中,我正在尝试设计一个域。请原谅神秘的类名,想专注于我手头面临的具体问题。
代码如下:
import scala.collection.mutable
class ClassTypeTest
{
trait TSM
{
def fit[T <: TSM](): FR[T]
}
abstract class FM extends TSM{}
trait MP[T <: TSM]
{
def name: String
}
trait FiM[T <: TSM]
{
val fittedParams = mutable.HashMap[String, MP[T]]()
}
class FR[T <: TSM](fm: FiM[T])
// Now define classes related to SMA
//===================================
abstract class SMAP extends MP[SMA]
class SMAO(n: String) extends SMAP
{
override def name = n
}
class SMAM(smao: SMAO) extends FiM[SMA]
{
fittedParams(smao.name) = smao
}
class SMA extends FM
{
override def fit[SMA]() =
{
val fim = new SMAM(new SMAO("x"))
//*******************************
// Following line shows the error:
// Error:(40, 25) type mismatch;
// found : ClassTypeTest.this.SMAM
// required: ClassTypeTest.this.FiM[SMA]
// new FR[SMA](fim)
//*******************************************
new FR[SMA](fim)
}
}
}
我将 SMAM 定义为 extends FiM[SMA],那么为什么编译器会抱怨 Type mismatch. Required FiM[SMA], found: SMAM。我是否定义错误的类型参数或约束之一?
我试图将 fit 方法的类型和 FR 对象限制为 TSM 的子类之一。我如何做到这一点?
【问题讨论】: