如何上载不可变的清单

时间:2018-08-04 08:55:28

标签: java casting immutablelist

我写了一个类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 个答案:

没有答案