Как вывернуть неизменный список
Я написал класс 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. желательно не использовать отражение
Можно ли написать такой метод? В противном случае, как бы вы решили проблему?