Почему пример не компилируется, иначе как (со-, противо- и не-) дисперсия работает?
Исходя изэтот вопросМожет кто-нибудь объяснить следующее в Scala:
class Slot[+T] (var some: T) {
// DOES NOT COMPILE
// "COVARIANT parameter in CONTRAVARIANT position"
}
Я понимаю разницу между+T
а такжеT
в объявлении типа (он компилируется, если я используюT
). Но тогда как на самом деле написать класс, который является ковариантным по своему параметру типа, не прибегая к созданию вещи?unparametrized? Как я могу гарантировать, что следующее может быть создано только с экземпляромT
?
class Slot[+T] (var some: Object){
def get() = { some.asInstanceOf[T] }
}
РЕДАКТИРОВАТЬ - теперь получил это до следующего:
abstract class _Slot[+T, V <: T] (var some: V) {
def getT() = { some }
}
это все хорошо, но теперь у меня есть два параметра типа, где я хочу только один. Я снова задам вопрос так:
Как я могу написатьнеизменный Slot
класс, которыйковариант в своем роде?
РЕДАКТИРОВАТЬ 2: Дух! я использовалvar
и неval
, Вот что я хотел:
class Slot[+T] (val some: T) {
}