Java 将泛型类型限制为方法上的超级类型
我有一个列表装饰,应该,在许多其他事情中,允许从一个列表到另一个铸造。这个想法是这样的,而且已经奏效了:Java 将泛型类型限制为方法上的超级类型,java,generics,Java,Generics,我有一个列表装饰,应该,在许多其他事情中,允许从一个列表到另一个铸造。这个想法是这样的,而且已经奏效了: public class ExtendedList<T> implements List<T> { private List<T> delegate; // constructors, methods, a collector, etc public <R> ExtendedList<R> castTo
public class ExtendedList<T> implements List<T> {
private List<T> delegate;
// constructors, methods, a collector, etc
public <R> ExtendedList<R> castTo(Class<R> targetType) {
return delegate.stream().map(item -> (R) item).collect(ExtendedList.toList());
}
}
您可以使用静态方法执行此操作:
public ExtendedList castToUnchecked(){
返回delegate.stream().map(item->(R)item.collect(ExtendedList.toList());
}
公共静态扩展列表castTo(扩展列表l){
返回l.castToUnchecked();
}
它确保R
是U
的超类,用作:
ExtendedList车辆=ExtendedList.castTo(车辆);
ExtendedList dogs=ExtendedList.castTo(cars);//错误:`Car`不扩展`Dog`
我目前无法测试此功能,但是公共
是否不起作用?您是否还希望允许车辆.castTo(Car.class)
?@Sweeper不,该功能不起作用。不是每辆车
都是车
,所以我的方法不允许这样做。@JacobG<代码>发出意外的令牌错误。这显然是无效的语法。这也是我的第一个想法。“创建一份所有项目都具有预期类型的列表副本”你没有抓住我的重点。你的代码不能保证任何事情。它只是将元素从列表
复制到另一个列表,而不注意元素的类型,并且一次只复制一个,效率很低。请看@VGR的要点谢谢!只有一个例外:当我使用函数时,我必须给出两个类型参数,比如:ExtendedList.castTo(cars)
,否则编译器会不满意。它应该只使用一个目标类型吗?
ExtendedList<Vehicle> vehicles = cars.castTo(Vehicle.class); // assuming Car implements Vehicle -> OK
ExtendedList<Dog> dogs = cars.castTo(Dog.class); // assuming Car does not extend Dog -> not OK