2013-09-05 3 views
1

제네릭 팩토리 메소드가 있습니다.인수없이 JVM에 제네릭 형식 매개 변수를 알 수있는 방법은 무엇입니까?

public static <T> List<T> create(){ 
    return new ArrayList<T>(); 
} 

그러나 인수/매개 변수가 없습니다.

함수에 대한 매개 변수를 제공하지 않지만 인수없이 적절한 형식을 알고 있습니다.

public static void main(String[] args){ 
    List<Integer> intlist = create(); //it is an Integer List 
    List<String> stringlist = create(); //it is a String List 
} 
+3

선언의 왼쪽에서 추측됩니다. –

+0

이것은 아마도 메소드 서명에서 한 번만 사용 된 일반 매개 변수가 의미가있는 완전히 쓸모없는 몇 가지 사례 중 하나가 아닐 수 있습니다. (다이아몬드 연산자가 Java 7에있는 것은 아니지만) – millimoose

답변

6

JVM은 유형 삭제로 인해 일반 유형 매개 변수를 알 수 없습니다.

자바 컴파일러는 당신이 선언 한 변수의 유형에 대한 일반 유형 정보에 액세스 할 수 있기 때문에, T이 예에서 Integer 또는 String을해야한다고 추론 할 수있다.

+0

JVM의 경우 'List intlist = new ArrayList'입니다. 형식 소거로 인해 두 경우 모두 (정수, 문자열)? – user2693979

+0

@ user2693979 맞습니다. – rgettman

+2

@ user2693979 JVM의 경우 List와 ArrayList 만 있고, 후자는 Object []가 있습니다. 유형 삭제는 제네릭 유형 정보가 * instances *에 내재적으로 첨부되지 않음을 의미합니다. (클래스 객체를 전달하여 명시 적으로 연결할 수 있으며 정보는 리플렉션을 통해 액세스 할 수있는 유형 및 메소드 선언으로 보존됩니다.) – millimoose

1

제네릭 매개 변수를 명시 적으로 지정하지 않으면 유추됩니다. 일반적으로 인수로부터 추론되지만 인수가없는 경우 제한된 경우 (예 : 변수 선언)는 왼쪽에서 추론 할 수 있습니다.

또 다른 관점은 제네릭 매개 변수를 명시 적으로 지정하지 않으면 컴파일러 이 실제로 매개 변수가 정확히에 영향을 미치지 않는다는 것입니다. 결국, type 매개 변수는 컴파일 된 바이트 코드에 전혀 영향을 미치지 않습니다. 이 작동하게하는 일부 유형 매개 변수이 있다는 것을 증명할 수 있어야합니다. 더 이상 상관하지 않습니다. 상황에 대해 여러 가지 유효한 유형 매개 변수가있을 수 있습니다. 결과에 아무런 영향을 미치지 않기 때문에 어느 것이 "사용"되었는지 신경 쓰지 않습니다. 이 경우 메서드는 아무런 인수도 사용하지 않으므로 에 관계없이 T에 관계없이 을 사용하는 컨텍스트에서 사용되는 한 List<T>을 반환합니다. 따라서 T은 메서드의 제네릭입니다. 존재 (T = whatever type parameter is desired). 따라서 컴파일러는이 경우 형식 매개 변수를 실제로 확인하지 않아도됩니다.

관련 문제