당신이하려는 것은 매우 유용하며 내가 작성한 코드에서 매우 자주해야한다는 것을 알았습니다. 사용 사례 예 :
인터페이스가 Foo
있고 package-private 인스턴스를 만들고 관리 하는 zorking
패키지 가 있다고 가정 해보십시오 . (매우 일반적인 시나리오입니다.) ZorkingFooManager
ZorkingFoo implements Foo
따라서을 ZorkingFooManager
포함해야 private Collection<ZorkingFoo> zorkingFoos
하지만을 노출해야합니다 public Collection<Foo> getAllFoos()
.
대부분의 Java 프로그래머는 getAllFoos()
new를 할당하고 ArrayList<Foo>
모든 요소를 zorkingFoos
채우고 반환하는 것으로 구현하기 전에 두 번 생각하지 않습니다 . 전 세계 수백만 대의 컴퓨터에서 실행되는 Java 코드가 소비하는 모든 클록 사이클의 약 30 %가 아무것도 생성하지 않은 채로 생성 된 후 가비지 수집 마이크로 초인 쓸모없는 ArrayLists 복사본을 생성하는 것 외에는 전혀 재미가 없습니다.
이 문제에 대한 해결책은 물론 컬렉션을 다운 캐스팅하는 것입니다. 가장 좋은 방법은 다음과 같습니다.
static <T,U extends T> List<T> downCastList( List<U> list )
{
return castList( list );
}
어떤 castList()
기능으로 우리를 가져옵니다 :
static <T,E> List<T> castList( List<E> list )
{
@SuppressWarnings( "unchecked" )
List<T> result = (List<T>)list;
return result;
}
result
Java 변수의 왜곡으로 인해 중간 변수가 필요합니다.
그래서, 사용에 정결하지 경우에도 @SuppressWarnings
A의 return
여분이 문제가 변수로 해결할 수있는 문제를 "결과"그래서 문, 그것은 할당에 사용하는 분명히 괜찮습니다. (어쨌든 컴파일러 또는 JIT에 의해 최적화되어야합니다.)