У меня есть следующие классы/черты в ScalaMissing компиляции ошибка/выполнения, когда встраивание
trait Write[-T] {
def add(elem : T);
}
class ContraListWrapper[T] (var list : List[T]) extends Write[T] {
def add(elem : T) = {
list = elem :: list
}
}
def bar(list : Write[Number]) = {}
Вызов метода с список объектов или список номеров, работ, благодаря контрвариации от записи признака.
var list : List[Number] = Nil;
var wlist = new ContraListWrapper(list);
bar(wlist);
var list : List[Object] = Nil;
var wlist = new ContraListWrapper(list);
bar(wlist);
Когда я вызываю бар со списком Integer, я получаю ошибку компиляции в Scala. Это ожидается; Целое не супертипом номер (но подтипа)
var list : List[Integer ] = new Integer(1) :: Nil;
var wlist = new ContraListWrapper(list);
bar(wlist); //error: type mismatch;
//found : contra.this.ContraListWrapper[Integer]
//required: contra.this.Write[Number]
Но когда я встраивать объявление переменной из списка Integer, исчезла ошибка компиляции, и даже, кажется, работает. (Я добавил элемент списка в методе бар)
var list : List[Integer] = new Integer(1) :: Nil;
bar(new ContraListWrapper(list)); //no compile- nor runtime error
Edit: ответы на ТНХ Rex Керр в смелой
1) Как ему это возможно? Первый тип Целое число выбрано, с инкрустацией Номер
2) Почему это не без инкрустирования? Scala может принимать подходящий тип
3) Почему я случайно не получаю ошибку времени выполнения? Поскольку Списки ковариантны
Ps. Я знаю, что могу получить контравариантность без черты и обертки и с привязкой.