在 Java 为什么我不能转换为子类型,在 forEach 中使用 lambda 表达式?

In Java why cant I cast to a subtype, using a lambda expression within a forEach?

我已经写了一些代码来试图更好地解释我想要实现的目标。

public interface Car extends ViewCar {

    static Car getInstance(String make, String model){
        NewCar newCar = new ConcreteCar();
        newCar.setMake(make);
        newCar.setModel(model);
        return newCar;
    }

    void drive();

}

ViewCarshowMake()showModel()showCar() 方法。

ConcreteCar 实现了 NewCar 中的所有方法。 NewCar 扩展 Car.

基本上就这样

Car car = Car.getInstance("Make", "Model")

会 return 一辆漂亮闪亮的新车吗?

我在 class 中有一个名为 Cars 的列表,其中包含 Car 对象。

所以就目前而言,如果获得列表并通过每辆车执行 forEach,我可以驾驶它或显示 make/model。

我想做的是使用 ViewCar 遍历整个列表,这将只能显示 make/model 而不能驱动。

有没有比下面的代码更好的方法来实现这个?

public void ViewCarCanOnlyPrintCar(){ //This works but looks a little longwinded to me

        List<ViewCar> viewCars = new ArrayList(cars.getCars());
        viewCars.forEach(car -> {
            car.showMake();
            car.showModel();
        });
    }

现在如果我能做到...

cars.getCars().forEach(ViewCar::showCar);

为什么我不能做这样的事情...

cars.getCars().forEach(ViewCar -> {
            showMake();
            showModel();
        });

在我的项目中,我有一个扩展多个其他接口的对象的主接口。我希望能够传递对象,但只允许访问某些方法。

我是不是漏掉了一些明显的东西?

编辑:我不希望能够存储 Cars 的列表,但是让其他 classes 获得该汽车列表并且只有减少的权限。所以显示汽车的 class 只会显示品牌和型号,不知道如何驾驶。我知道 List<Car> 不是 List<ViewCar>,尽管我可以执行以下操作:

Car car = new Car();
ViewCar viewCar = car;

那么我怎样才能达到类似的结果呢?这种东西有设计模式吗?或者我只需要通过 List<Car> 然后做

cars.forEach((ViewCar viewCar) -> {
     viewCar.showMake()
})

感谢@Holger 让我知道 Collections.unmodifiableList() 方法。我的答案的解决方案如下;

List<Car> cars = new ArrayList<>();

public List<ViewCar> getCars(){
    return Collections.unmodifiableList(cars);
}

这让我可以做类似

的事情
public void printCars(List<ViewCar> cars){
    cars.forEach(car -> {
        car.showMake();
        car.showModel();
    });
}

这是 getCars() 的最后一次迭代;

Stream<Car> getCars(){
    return cars.stream()
}

Stream<ViewCar> getViewCars(){
    return cars.stream.map(Function.identity());
}

感谢@Holger 的帮助!非常感谢