Допустим, у меня есть два класса A и B, с B подтипом A. Очевидно, что это только часть иерархии более богатых типов, но я не думаю, что это актуально.Предположим, что A является корнем иерархии.Существует класс коллекции C, который отслеживает список A.Тем не менее, я хочу сделать C универсальным, чтобы можно было создать экземпляр, который хранит только B и не принимает A.
class A(val c: C[A]) {
c.addEntry(this)
}
class B(c: C[A]) extends A(c)
class C[T <: A]{
val entries = new ArrayBuffer[T]()
def addEntry(e: T) { entries += e }
}
object Generic {
def main(args : Array[String]) {
val c = new C[B]()
new B(c)
}
}
Приведенный выше код, очевидно, дает ошибку «несоответствие типов»: найденоC [B], требуется C [A] 'в строке new B(c)
.
Я не уверен, как это можно исправить.Невозможно сделать C ковариантным в T (например, C[+T <: A]
), потому что ArrayBuffer не типизирован в T. Невозможно заставить конструктор B требовать C [B], потому что C не может быть ковариантным.
Я лаю не на том дереве?Я полный новичок в Scala, поэтому любые идеи и советы могут быть полезны.Спасибо!
РЕДАКТИРОВАТЬ: В основном, я хотел бы, чтобы компилятор принимал как
val c = new C[B]()
new B(c)
и
val c = new C[A]()
new B(c)
, но отклонил бы
val c = new C[B]()
new A(c)
Возможно, можно смягчить тип ArrayBuffer в C, чтобы он был A вместо T, и, таким образом, в методе addEntry, если это поможет.