Тип допускает nullable по умолчанию, поэтому ваше определение типа класса может быть просто <T>
, а не <T: Any?>
. Тип generi c может быть назначен как ненулевой, когда используется класс (например, использование QueueLightweight<String>
вместо QueueLightweight<String?>
), поэтому вы должны обращаться с ним, как если бы вы работали с тип generi c внутри класса.
Это источник вашей первой проблемы. Ваш NodeQLE ожидает, возможно, ненулевой параметр для своего конструктора, но вы заставляете его иметь значение null. Ваш метод add
должен принимать параметр T
, а не принудительный T?
.
Тогда в В своем итераторе вы объявляете переменную как (возможно) ненулевую E
, но присваиваете ей значение null. Вам нужно сделать переменную обнуляемой. Так как он может вернуть ноль, даже если E не обнуляем, вы должны вызвать исключение, если следующего значения нет. Но это можно упростить, изменив ветвление, поэтому метод должен выглядеть следующим образом:
override fun next(): E {
n?.let {
n = it.next
return it.item
}
throw NoSuchElementException()
}