【问题标题】:Direct casting in foreach loop在 foreach 循环中直接转换
【发布时间】:2012-06-18 11:49:23
【问题描述】:

我想知道是否可以在 foreach 循环中直接转换对象。

我们有以下两个类,一个扩展另一个:

class Book {};
class ExtendedBook extends Book {};

现在我们有一个我想要循环浏览的书籍数组,因为它是一个扩展书籍搜索,我确信所有书籍实际上都是扩展书籍。有没有办法直接投射它们?

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){}

我知道这不是一个真正的痛苦,但保持循环更短会更好,并且可能更易读,因为你保存了一个虚拟变量,该变量仅用于强制转换而不是实际操作。

【问题讨论】:

  • 看来 books 是 Book 而非 ExtendedBook 的数组。数组的元素可能是 ExtendedBook,但您只能对每个元素进行更改。顺便说一句,您可以循环拆箱Long[] array = ... for(long l: array) { }

标签: java arrays foreach


【解决方案1】:

使用泛型怎么样?

将您的 getBooks 签名写为:

<B extends Book> B [] getBooks(Class<B> bookType)

现在,如果您想搜索ExtendedBook 类型的书籍,只需致电:

ExtendedBooks [] eBooks = bookSearch.getBooks(ExtendedBook.class)

不需要类型转换或其他不安全的东西。干净整洁。

当然,您仍然需要确保只有 ExtendedBook 只返回那种书,但看起来您已经解决了这个问题。

【讨论】:

  • 实际上我正在使用 Web 服务并有一个生成的客户端返回数组。
【解决方案2】:

我有理由确定你不能随心所欲地在循环中投射。

【讨论】:

    【解决方案3】:

    考虑铸造

    ExtendedBook ex=(ExtendedBook)new Book();
    

    它被编译器接受但JVM抛出java.lang.ClassCastException,因为这种类型的转换是错误的->Book不是ExtendedBook,所以它有可能不会处理ExtendedBook中添加的潜在新方法班级。

    出于同样的原因,你不能做类似的事情

    ExtendedBook[] exbooksB=(ExtendedBook[]) new Book[10];
    

    但可以

    Book[] booksA=new ExtendedBook[10];
    ExtendedBook[] exbooks=(ExtendedBook[]) booksA;
    

    【讨论】:

      【解决方案4】:

      你不能,因为 java 不支持隐式转换重载,就像在 C# 中使用 implicit operator 一样。

      【讨论】:

        【解决方案5】:

        你可以这样做。

        Iterables.filter('Your array', the type class).forEach(x -> { } }
        
        Iterables.filter(data, JSONObject.class).forEach(x -> { 
            x.getString("something") });    
        

        【讨论】:

          猜你喜欢
          • 2021-02-18
          • 2021-03-12
          • 2014-12-11
          • 2019-08-25
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多