Некоторое время я использовал 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
. Я неправильно определил один из параметров или ограничений типа?
Я пытаюсь ограничить тип метода соответствия и объект FR одним из подклассов TSM. Как мне этого добиться?