我想知道是否可以在 foreach 循环中直接转换对象。
我们有以下两个类,一个扩展另一个:
class Book {};
class ExtendedBook extends Book {};
现在我们有一个我想遍历的 Books 数组,因为它是一个 ExtendedBook 搜索,我确信所有 Books 实际上都是 Extended Books。有没有办法直接转换它们?
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){}
我知道这不是真正的痛苦,但保持循环较短会很好,并且在您保存虚拟变量时可能更具可读性,它仅用于转换而不是实际操作。
最佳答案
使用泛型怎么样?
将您的 getBooks 签名写为:
<B extends Book> B [] getBooks(Class<B> bookType)
现在,如果你想搜索ExtendedBook
类型的书籍,只需调用:
ExtendedBooks [] eBooks = bookSearch.getBooks(ExtendedBook.class)
不需要类型转换或其他不安全的东西。漂亮干净。
当然,您仍然需要确保只有 ExtendedBook
只返回那种书,但看起来您已经解决了这个问题。
关于java - 在 foreach 循环中直接转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11050148/