2009-02-23 7 views
5

이전의 캐스팅 방식보다 다음과 같은 이유는 무엇입니까?Java generics

MyObj obj = someService.find(MyObj.class, "someId");

MyObj obj = (MyObj) someService.find("someId");

+1

누가이 더 있다고? – Milhous

답변

4

명시 적 형식 매개 변수를 사용하는 또 다른 이점은 Proxy (이 경우 MyObjMyInterface이어야 함)을 사용하여 서비스 메서드를 구현할 수 있다는 것입니다. 명시 적 형식 매개 변수가 없으면이 작업을 수행 할 수 없습니다.

당신은 여러 가지 이유 (하나 테스트)

9

당신이 ClassCastException를 얻을 수 있도록 비 제네릭 버전이 유형의 '하여 MyObj'객체를 반환 않는다는 보장은 없습니다.

6

사례 1의 경우 MyObj 유형의 someId ID를 가진 객체를 찾을 수없는 경우 가장 잘 구현 된 서비스가 null을 반환 할 수 있습니다. 또한 첫 번째 경우는 서비스가 MyObj 유형의 클래스로 작업 할 때 특정 논리를 특정하게 가질 수 있습니다.

사례 2의 경우 instanceof를 사용하지 않으면 (가능하면 피하십시오) 잡아서 처리해야하는 추악한 ClassCastException이 발생합니다.

3

첫 번째 시나리오가 더 좋은 이유 중 하나는 이제 find(Class,String) 메서드가 반환 값이 할당되는 대상에 대한 지식이 있다는 것입니다. 따라서 이제는 올바른 유형이 반환되기를 바라는 대신 내부적으로 관련 캐스트를 수행 할 수 있습니다. 예를 들어, find 메서드는 "someId"과 함께 호출 될 때 String 개체를 내부적으로 찾습니다. find 메소드에는 StringMyObj 인스턴스로 캐스팅하기위한 전략이있을 수 있습니다.

0

그것은이 아닌 더 나은 커버 아래 Proxy을 사용할 수 있습니다. 분명히 아주 특별한 상황을 제외하고는 더 나빠집니다. 당신이 그런 종류의 것을 필요로 할 때만 대상이 클래스 객체에 대한 newInstance() (등)를 호출 할 필요가있는 곳입니다 - 팩토리 메소드와 물건. 당신이 전자를 저장하려면

, BTW,이 또한 작동

MyObj obj = someService.find((Class<MyObj>) null, "someId");