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