2012-06-15 5 views
10

foreach 루프 내에서 직접 개체를 캐스팅 할 수 있는지 궁금합니다.foreach 루프에서 직접 캐스팅

우리는 하나가 다른 다음과 같은 두 개의 클래스를 확장하고있다하십시오 ExtendedBook 검색 나는 모든 책이라는 것을 확신 그 때문에 지금

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

을 나는 그것하지 진짜 고통을 알고 있지만, 당신은 단지 주조에 사용되는 더미 변수를 저장 짧은 루프를 유지하는 것은 좋은 어쩌면 더 읽을 것 실제 행동 대신.

+2

'books'는 Book not ExtendedBook의 배열입니다. 배열의 요소는 ExtendedBook 일 수도 있지만 각 요소에 대해서만 변경할 수 있습니다. btw 루프에서 unbox 할 수 있습니다.'long [] array = ... for (long l : array) {}' –

답변

1

원하는대로 루프를 전송할 수 없다고 합리적으로 확신합니다.

0

java가 implicit operator 인 C#과 같이 암시 적 변환 과부화를 지원하지 않기 때문에 사용자가 변환 할 수 없습니다. >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

식으로 뭔가를 할 수 없어 같은 이유로

?

이 같은 getBooks 서명 쓰기 : 당신이 유형 ExtendedBook의 책을 검색하려면 지금

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

를 바로 호출하지 :

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

어떤 타입 캐스팅 또는 필요한 다른 안전하지 않은 물건. 좋고 깨끗합니다.

물론 ExtendedBook 만 그런 종류의 책만 반환한다는 것을 확인해야하지만 이미 해결 한 것처럼 보입니다.

+0

실제로 웹 서비스를 사용하고 배열을 반환하는 생성 된 클라이언트가 있습니다. –

+0

오케이. 이 경우, 나는 그것에 대해 할 수있는 일이 많지 않다고 생각합니다 ... –

관련 문제