我想知道是否可以在foreach循环中直接转换对象。
我们有以下两个类,一个扩展另一个:
class Book {};
class ExtendedBook extends Book {};
现在我们有一系列书籍,我想循环,因为它的ExtendedBook搜索我确信所有书籍实际上都是扩展书籍。有没有办法直接施放它们?
Book [] books = bookSearch.getBooks("extendedBooks");
for (Book book: books){
ExtendedBook eBook = (ExtendedBook) book;
....
}
这涉及两个步骤。首先循环阅读书籍,然后在第二步中投射它们。一个人可以一步到位吗?
什么行不通:
// Directly assign it to a different type
for (ExtendedBook book : books){}
// Directly casting the array
ExtendedBooks [] eBooks = (ExtendedBooks []) books;
// Same goes for trying both in one step
for (ExtendedBook book : (ExtendedBook []) books){}
我知道这不是一个真正的痛苦,但保持循环更短会很好,也许更可读,因为你保存一个虚拟变量,它只用于投射而不是实际的动作。
答案 0 :(得分:2)
如何使用Generics?
将您的getBooks签名写为:
<B extends Book> B [] getBooks(Class<B> bookType)
现在,如果您要搜索ExtendedBook
类型的图书,请致电:
ExtendedBooks [] eBooks = bookSearch.getBooks(ExtendedBook.class)
不需要进行类型转换或其他不安全的操作。很干净。
当然,您仍然必须确保只有ExtendedBook
才会返回那种书,但看起来您已经解决了这个问题。
答案 1 :(得分:1)
我有理由相信你不能按照自己的意愿投入循环。
答案 2 :(得分:1)
思考过时投射
ExtendedBook ex=(ExtendedBook)new Book();
它被compilator接受但JVM抛出java.lang.ClassCastException
,因为这种类型的转换是错误的 - &gt; Book
不是ExtendedBook
,因此它有可能无法处理ExtendedBook
类中添加的潜在新方法。
出于同样的原因,你不能做像
这样的事情ExtendedBook[] exbooksB=(ExtendedBook[]) new Book[10];
但可以
Book[] booksA=new ExtendedBook[10];
ExtendedBook[] exbooks=(ExtendedBook[]) booksA;
答案 3 :(得分:0)
你不能因为java不支持隐式转换重载,就像在C#中使用implicit operator一样。
答案 4 :(得分:0)
您可以这样做。
Iterables.filter('Your array', the type class).forEach(x -> { } }
Iterables.filter(data, JSONObject.class).forEach(x -> {
x.getString("something") });