在 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();
}
ViewCar
有 showMake()
、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 的帮助!非常感谢
我已经写了一些代码来试图更好地解释我想要实现的目标。
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();
}
ViewCar
有 showMake()
、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 的帮助!非常感谢