我写了一个类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.最好不要使用反射
是否可以编写这样的方法?如果失败,您将如何解决该问题?