2012-06-15 6 views
10

foreachループ内でオブジェクトを直接キャストすることが可能かどうか疑問に思っていました。そのExtendedBook検索は、私はすべての書籍であることを確信しているのでforeachループで直接キャスト

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

今、私たちは、私はをループにしたいブックの配列を持っている:私たちは、次の2つのクラスが、一方が他方を拡張し、持っている

実際には拡張書籍。直接キャストする方法はありますか?

Book [] books = bookSearch.getBooks("extendedBooks"); 

for (Book book: books){ 
    ExtendedBook eBook = (ExtendedBook) book; 
    .... 
} 

これには2つの手順があります。最初に本をループし、2番目のステップでそれらをキャストします。 1つのステップでそれを行うことはできますか?私はそのない本当の痛みを知っているが、あなただけの鋳造に使用されるダミー変数を、保存するように短いループを維持することは素晴らしく、多分、より読みやすいでしょう

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

:どのような動作しません

実際の行動の代わりに

+2

'books'はBook not ExtendedBookの配列です。配列の要素はExtendedBookかもしれませんが、要素ごとにしか変更できません。あなたはループ内でunboxすることができます。 '' long [] array = ... for(long l:array){} ' –

答えて

1

あなたが望むようにループにキャストできないことは間違いありません。

0

javaは暗黙的な変換のオーバーロードをC#のようにimplicit operatorでサポートしていないため、できません。 >BookExtendedBookないので、それは文句を言わない潜在的な新しい方法を扱う可能性があります - 鋳物の型が間違っているので

1

は、

ExtendedBook ex=(ExtendedBook)new Book(); 

それはcompilatorによって受け入れられているが、JVMがjava.lang.ClassCastExceptionをスローをキャストobout考えますExtendedBookクラスに追加されました。あなたはどのようにジェネリック医薬品の使用について

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

ことができますが、

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

ような何かを行うことはできません同じ理由

?あなたがタイプExtendedBookの図書を検索したい場合は、単に呼び出していない、

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

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

んが、型キャストまたは必要に応じてその他の危険なものを

は、としてあなたはgetBooks署名を書き込みます。ニースと清潔。

もちろん、あなたはまだExtendedBookだけがその種類の本を返すことを確認しなければなりませんが、それはあなたがすでにそれを解決したように見えます。

+0

実際に私はWebサービスを扱っており、配列を返す生成されたクライアントを持っています。 –

+0

よろしくお願いします。その場合、私はそれについてあなたができることはたくさんあるとは思わない... –