2014-10-14 2 views
0

아래 빌드 메서드는 TypedMemberDTO의 인스턴스를 만듭니다.원시 형식과 비교 한 메서드의 제네릭 이해

TypedMemberDTO는 입력 List

Member.getDetails가 난 단지 런타임에이 개 유형 중 하나가 될 것입니다 알고 Object 유형을 반환 포함 할 수 있습니다. 이러한 유형은 Object을 확장하는 것 외에는 공통점이 없습니다. 내가 원하는 무엇

TypedMemberDTO에 상세 정보를 설정하는 제네릭을 사용하는 빌드 방법을 만드는 것입니다.

코드는 잘 컴파일하고 나는 <U> 입력이 실제로 나에게 제공 무엇인지에 조금 혼란 스러워요 있지만, 잘 실행됩니다. 내가 대신 <U>의 여기 원시 유형을 사용하면 현실에서

는, 나는 같은 컴파일 시간 혜택을 얻을 것?

빌드 방법을 작성하는 더 좋은 방법이 있습니까?

public class TypedMemberDTO<T> extends MemberDTO { 
    private List<T> details; 

    public List<T> getDetails() { 
     return details; 
    } 

    public void setDetails(List<T> details) { 
     this.details = details; 
    } 
} 


public <U> TypedMemberDTO<?> build(Member member, String attributeName) { 
    TypedMemberDTO<U> typedMemberDTO = new TypedMemberDTO<U>(); 
    List<U> dtos = (List<U>) member.getDetails(attributeName); 
    typedMemberDTO.setDetails(dtos); 
    return typedMemberDTO; 
} 
+0

은 어떤 유형을 나타낼 수 있습니까? – SamTebbs33

+0

컴파일시 안전성을 전혀 제공하지 않습니다. 이것이 의미하는 바는 비 안전은 코드의 나머지 부분을 스며 들기보다는이 한 가지 방법으로 제한된다는 것입니다. SamTebbs33 @ –

+0

- 난 두 가지 유형 중 하나가 될 수 있습니다 그것은 위에서 언급 한,이 내 코드 – DJ180

답변

1

실행시 Generics가 존재하지 않습니다. 코드는 컴파일 타임에 사용되어 강제 캐스트를 피함으로써 가능한 한 런타임에 ClassCastException을 피할 수 있습니다. 그러나 런타임시 일반 클래스에 속한 객체 유형은 단순히 원시 유형입니다.

클래스가 generic이 아닌 경우 컴파일러에서 어떤 종류의 List이 반환되었는지를 알 수 없으므로 원시 형식을 사용하는 것과 차이가 없습니다.

일반적인 방법은 파라미터 타입 및 리턴 형 사이 또는 하나 개의 파라미터 및 다른 유형의 관계에 특별한 제한이 부과된다. 이 경우 매개 변수 목록에 제네릭 유형 U에 대한 언급이 없습니다. 따라서 본질적으로 아무것도 확인하지 않습니다.

관련 문제