Как вывернуть неизменный список

Я написал класс ImmutableList<T> который похож на ArrayList<T> за исключением того, что нет никаких операций добавления или удаления.

Теперь скажем, у нас есть класс Animal и подкласс Cat,

Я знаю, что бросок из List<Cat> в List<Animal> не безопасно, потому что это позволило бы вставить Dog Объект в списке кошек.

Эта проблема не существует с неизменяемыми списками, потому что в любом случае нельзя вставить что-либо в неизменяемый список:

ImmutableList<Cat> cats = ImmutableList.of(berlioz, marie, toulouse);
ImmutableList<Animal> animals = cats;

безопасно, но компилятор не допустит этого.

Поэтому я хотел бы добавить метод ImmutableList это помогает мне выполнить безопасное приведение, может быть, так

ImmutableList<Cat> cats = ImmutableList.of(berlioz, marie, toulouse);
ImmutableList<Animal> animals = cats.upcast();

или даже

ImmutableList<Cat> cats = ImmutableList.of(berlioz, marie, toulouse);
ImmutableList<Animal> animals = cats.upcast(Animal.class);

я пытался

 public <S super T> ImmutableList<S> upcast() {
   return (ImmutableList) this;
 }

но это не компилируется (вы не можете сказать, <S super T> только здесь <S extends T>).

Желаемый метод должен удовлетворять некоторым требованиям

1. Он не должен допускать небезопасных бросков, таких как ImmutableList<Animal> в ImmutableList<Cat>
2. Он должен быть эффективным, т.е. не копировать список
3. желательно не использовать отражение

Можно ли написать такой метод? В противном случае, как бы вы решили проблему?

0 ответов

Другие вопросы по тегам