Пара вопросов о Scala абстрактных типов.Scala абстрактные пути зависимых типа проблема часть 2
- Должен ли я использовать параметризованные типы [], если я хочу использовать тип в значении конструктора? то есть. возможно ли иметь класс с абстрактными типами параметров конструктора? Если я избавлюсь от [T1, T2] и использую INode # TKey и INode # TValue как типы параметров конструктора, что я делаю? Я получаю путаные сообщения об ошибках.
- Как я могу решить эту проблему, не прибегая к внутренним типам? Мое использование INode в определениях, по-видимому, подразумевает, что я мог бы вернуть/получить INode с различными типами для TKey & TValue. Как ограничить его теми же типами TKey/TValue, что и мой текущий тип, не ограничивая себя возвратом/получением именно этого «экземпляра»?
trait AbsTypes
{
type TKey
type TValue
}
trait INode extends AbsTypes
{
def get(key : TKey) : TValue
def set(key : TKey, v : TValue) : INode
def combine(other : INode, key : TKey): INode
}
class ANode[T1,T2](
val akey : T1,
val aval : T2
) extends INode
{
type TKey = T1
type TValue = T2
type Node = ANode[T1,T2]
def get(key : TKey) : TValue = { aval }
def set(key : TKey, v : TValue) : INode = {
new ANode(key,v)
}
def combine(other : INode, key :TKey) : INode = {
//ERROR : type mismatch; found : key.type (with underlying type ANode.this.TKey) required: other.TKey
other.set(key, aval)
}
}
См http://stackoverflow.com/questions/1154571/scala-abstract-types-vs-generics для обсуждения, когда использовать абстрактные типы в сравнении параметризованных типов – oluies