rendMovies 声明类似于
ArrayList<Movie> rentedMovies
因此,您将能够了解的有关集合中包含的对象的最具体信息是它们的类型Movie
。你不得不在 Java 中这样做,因为泛型集合只能有一个特定的类型。为了能够将所有子类添加到集合中,您必须提供一个公共超类。
当您将对象添加到类时,类型信息会丢失。例如:
Comedy comedy = new Comedy();
rentedMovies.add(comedy);
Comedy comedy2 = rentedMovies.get(0); // compile error: get returns Movie
Movie movie = rentedMovie.get(0); // correct
简而言之,如果您不需要当前电影的索引,那么您的片段是等效的。请注意,for-each 语句在引擎盖下与迭代器一起使用,因此如果您正在修改循环内的集合,那么您必须注意您在做什么。
如果您想从集合中检索到元素的特定信息,那么您必须自己向下转换它(并且忘记编译类型安全而无需手动检查),例如:
public Comedy asComedy() {
return this instanceof Comedy ? (Comedy)this : null;
}
但是如果你需要这样做,那么你应该重新设计继承。也许您可以将行为完全移动到的子类中,Movie
这样您就不需要知道具体的类型,而只需调用公共接口的方法。