2009-07-07 3 views
4

'Arraylist'을 'Arraylist<Type>'으로 변환하는 좀 더 우아한 해결책이 있습니까?형식이 지정되지 않은 Arraylist를 형식화 된 Arraylist로 변환

현재 코드 :이 본질적으로 안전하지 않은, 그래서 getProductsList 업데이트 할 수없는 경우에만 사용되어야한다는 것을

ArrayList productsArrayList=getProductsList(); 
ArrayList<ProductListBean> productList = new ArrayList<ProductListBean>(); 

for (Object item : productsArrayList) 
{ 
    ProductListBean product = (ProductListBean)item; 
    productList.add(product); 
} 

답변

10
ArrayList<ProductListBean> productList = (ArrayList<ProductListBean>)getProductsList(); 

참고.

4

Java에 대해 삭제 형식 을 찾아보십시오.

ProductListBean을 포함하는 것으로 컬렉션을 입력하면 컴파일러에서 컬렉션의 주석으로 표시되며 컴파일러는이 작업을 사용하여 올바른 작업 (즉, Fruit 클래스 추가는 유효하지 않음)을 결정할 수 있습니다.

그러나 일단 컴파일되면 컬렉션 정보는 지워졌 기 때문에 단순히 ArrayList입니다. 따라서 ArrayList<ProductListBean>ArrayList은 똑같습니다. 캐스팅 (Matthew의 답변 에서처럼)이 작동합니다.

1

당신이 묘사하는 방식은 유형 안전합니다 (실제로는 좋지는 않지만 틀린다면 ClassCastException을 던질 것입니다.)하지만 가장 느리고 가장 장황한 방법입니다 (꽤 명확하지만). 단순히 ArrayList를 캐스팅하는 예제가 가장 빠르지 만 포스터가 타입 세이프가 아니므로 어쨌든 다른리스트로 복사하려고합니다. 당신이 ArrayList에 복사하는 대신 (당신이해야하는) 목록에 만족해야 할 당신의 필요를 포기할 준비가되어있는 경우, 단순히 수행 기본 복사가 시스템으로 수행되기 때문에

List<ProductListBean> productList = 
     Arrays.asList(((List<ProductListBean>)getProductsList()).toArray(new ProductListBean[] {})); 

이 빨리 .arraycopy는 네이티브 메서드이며 유형 보증되지는 않습니다 (다시는 실제로는 아니지만 예제와 마찬가지로 안전합니다). 왜냐하면 System.arraycopy는 동일한 유형이 아닌 무언가를 추가하려고하면 ArrayStoreException을 던질 것이기 때문입니다.