2009-01-20 3 views
5

아이디어는 derrived 클래스에 정의 된 메소드를 호출 할 수있는 기본 클래스를 정의하는 것입니다. 그러나 생성시에 이러한 메소드는 요구 사항에 따라 정확하게 정의됩니다. 즉, 메소드가 단 하나의 인수 인 a HashMap <String String>.Java : 일반 클래스 유형 정의를 확인하는 방법은 무엇입니까?

지금까지 메소드에 하나의 매개 변수 만 있고 클래스 HashMap인지 확인하기 위해 다음 코드를 사용할 수 있었지만 어떻게 일반 정의가 <String, String인지 확인 할 수 있습니까?

public boolean isMethodParameterValid(final Method method) { 
    final Class<?>[] parameters = method.getParameterTypes(); 
    return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class)); 
} 

답변

7

수 없습니다. Java 제네릭 형식은 컴파일러에서 "지워짐"합니다. 즉 HashMap<String, String>은 런타임에 HashMap이됩니다. 질문 : this을 참조하십시오.

+1

일부 유형은 지워지지 않는 경우가 있습니다. 다른 예는'new ArrayList {}'입니다. Neal Gafter의 수퍼 유형 토큰 게시물도 읽을 가치가 있습니다. http://gafter.blogspot.com/2006/12/super-type-tokens.html – johnstok

+0

아니요, Neals Gafter의 수퍼 유형 토큰은 컴파일 할 때 지워집니다. 런타임시 (Type.getClass()가 허가 된 이후) 제네릭을 인스턴스화하는 데 사용 된 Type에 액세스하는 데 도움이되는 트릭을 사용합니다. – JVerstry

1

나는 당신이하려는 것을 정말로 이해하지 못합니다. 컴파일 할 때 클래스 계층 구조를주의 깊게 디자인함으로써이를 확인할 수 있어야한다고 생각합니다. 그러나 해결하려는 문제에 대한 세부 정보가 없으면 도움이되지 않습니다.

1

위에서 언급했듯이 런타임에는 유형의 일반 부분을 볼 수 없습니다.

템플릿 패턴과 같이 추상적 인 방법을 정의 할 수있는 이유가 있습니까?

그런 다음 검사가 정적으로 수행됩니다.

protected abstract void process(HashMap<String, String>); 

(단지지도상에서의 HashMap을 필요로하는 이유가?) 사실

12

,이 유형의 삭제는 있지만/필드 변수에 적용되지 않습니다 - 클래스 만의 정의 타입 PARAMS에 지워지고 상한으로 대체됩니다.

이것은 당신이 요구하는 것이 달성 될 수 있음을 의미합니다. 메소드의 첫 번째 매개 변수에 대한 일반 매개 변수를 검사하는 방법은 다음과 같습니다.

class Z 
{ 
    public void f(List<String> lst) { } 
} 

... 

Method m = Z.class.getMethod("f", List.class); 
Type t = m.getGenericParameterTypes()[0]; 
if(t instanceof ParameterizedType) { 
    ParameterizedType pt = (ParameterizedType) t; 
    System.out.println("Generic params of first argument: " + Arrays.toString(pt.getActualTypeArguments())); 
}  
+0

예. 런타임에 클래스의 인스턴스가있는 경우 일반 유형 매개 변수의 유형을 묻지 않습니다. 제네릭 형식 매개 변수로 정의되었을 수있는 메서드, 클래스 또는 필드에 반사 핸들이있는 경우 리플렉션 메서드를 사용하여 해당 제네릭 매개 변수의 유형, 유형, 와일드 카드, 형식 변수 등을 결정할 수 있습니다. – pholser

관련 문제