12

foreachループ内でオブジェクトを直接キャストすることは可能かどうか疑問に思いました。

次の2つのクラスがあり、一方が他方を拡張します。

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

これで、ループしたい本の配列ができました。これは、ExtendedBook検索であるため、すべての本が実際には拡張本であると確信しています。それらを直接キャストする方法はありますか?

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

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

これには2つのステップが含まれます。最初に本をループし、2番目のステップでそれらをキャストします。ワンステップでそれを行うことができますか?

動作しないもの:

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

本当の苦痛ではないことはわかっていますが、実際のアクションの代わりにキャストに使用されるダミー変数を保存すると、ループを短くしておくと便利で読みやすくなります。

4

5 に答える 5

3

ジェネリックを使用するのはどうですか?

getBooksの署名を次のように記述します。

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

ここで、このタイプの本を検索する場合は、次のようExtendedBookに呼び出します。

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

型キャストやその他の危険なものは必要ありません。素敵できれい。

もちろん、ExtendedBookその種類の本だけが返されることを確認する必要がありますが、すでにそれを解決したようです。

于 2012-06-15T12:33:00.687 に答える
2

私はあなたが望むようにループにキャストすることはできないと合理的に確信しています。

于 2012-06-15T11:54:24.987 に答える
1

頑固なキャスティングを考える

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;
于 2012-06-15T12:25:41.530 に答える
0

Javaは、暗黙の演算子を使用したC#のように、暗黙の変換オーバーロードをサポートしていないため、これはできません。

于 2012-06-15T12:16:40.730 に答える
0

あなたはこれを行うことができます。

Iterables.filter('Your array', the type class).forEach(x -> { } }

Iterables.filter(data, JSONObject.class).forEach(x -> { 
    x.getString("something") });    
于 2020-07-04T02:20:44.357 に答える