2014-11-01 4 views
1

아래 표시된 일반 메서드가 있고 해당 형식 인 변수를 사용하여 메서드를 호출하려고합니다. 그러한 변수를 정의하는 방법은 무엇입니까? 유형을 할당하는 방법에 대해 설명합니다.Java에서 제네릭 메서드를 호출하는 형식 변수를 정의하는 방법

방법 제네릭 메소드를 호출하는 변수를 정의 C1 및 C2

t.<C1> getListConfigObjects("foo", String.class); 
t.<C2> getListConfigObjects("foo", String.class); 

으로 호출없이 문제?

자바 둘 다 컴파일한다고 가정

Type <? extends JsonXformIntf> theType = C1.getType(); 
t.<theType> getListConfigObjects("foo", String.class); 

theType = C2.getType(); 
t.<theType> getListConfigObjects("foo", String.class); 
+1

이렇게하면 어떻게 될 것이라고 생각하십니까? 왜 이런 짓을하는? –

+0

제네릭은 Java에서 지워지므로 ... 그렇게 할 수는 없습니다. 어쩌면 우리가 왜 필요하다고 생각하는지 우리에게 말하면 우리가 도울 수 있습니다. – Radiodef

+0

@Radiodef'제네릭은 Java에서 지워졌습니까? ' – billz

답변

1

이 같은 작업을 수행하는 방법, 컴파일 된 바이트 코드의 관점 (및 런타임 동작에 따라서 어떤 수의 차이)이 두 사이에 전혀 차이가 없습니다 :

t.<C1>getListConfigObjects("foo", String.class); 
t.<C2>getListConfigObjects("foo", String.class); 

제네릭은 컴파일 타임 전용입니다. 유형 삭제 후에는 모두 t.getListConfigObjects("foo", String.class);입니다. 즉, 으로 지정한 형식 인수는 런타임에 메서드에 알 수 없습니다..

명시 적으로 지정된 유형의 인수는 컴파일러의 유형 확인을위한 용도로만 사용됩니다. 올바른 유형의 인수를 명시 적으로 지정하면 컴파일러에서 컴파일 할 수 있습니다 (반면 컴파일러는 잘못 추정 할 수 있음). 반대로 잘못된 형식 인수를 명시 적으로 지정하면 컴파일되지 않습니다. 그러나 둘 다 컴파일하면 아무런 차이가 없습니다.

따라서 컴파일 타임에 알 수없는 형식 인수를 지정하는 것은 의미가 없습니다. 왜냐하면 컴파일 시간은 이러한 형식 인수가 전혀 사용되지 않는 유일한 시간이기 때문입니다. 컴파일을 허용하는 모든 유형 인수를 선택하기 만하면됩니다.

관련 문제