在foreach循环中直接铸造

时间:2012-06-15 11:51:39

标签: java arrays foreach

我想知道是否可以在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){}

我知道这不是一个真正的痛苦,但保持循环更短会很好,也许更可读,因为你保存一个虚拟变量,它只用于投射而不是实际的动作。

5 个答案:

答案 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") });