Scala 有以下任务。您需要在集合中存储 Record 类型的实例。此外,这种类型的特定实例必须以某种方式继承方法write(a: A): Unit,其中A的值类型,对于每个特定的实现都是不同的Record。以下是抽象类型的示例实现:
trait RecValue
{
type A
def value: A
}
trait Record
{
type A <: RecValue
def read(): A
def write(v: A): Unit
}
class StringRecord extends Record
{
type A = StringValue
override def read(): A = {new StringValue("abc")}
override def write(v: A): Unit = {println(v)}
}
class StringValue(private val v: String) extends RecValue
{
type A = String
override def value: String = v
}
一切似乎都很好。write当对集合中的元素调用方法时会出现问题:
val a = new StringRecord
val b = new StringValue("aga")
a.write(b) // С конкретным типом все работает
Console println List[Record](a)(0).read() // и тут все замечательно работает!
List[Record](a)(0).write(b) // а вот здесь - не компилируется!
编译器抛出类型错误
[error] found : b.type (with underlying type sample.StringValue)
[error] required: _1.A where val _1: sample.Record
[error] List[Record](a)(0).write(b)
[error] ^
如果没有显式的类型转换,如何(有可能?)解决这个问题?我还想保留这个类层次结构的一般属性,以便RecValue对应的有对应的类型Record