2012-04-18 2 views
0

어떻게하면 COMPILE 시간에 확인할 수 있습니까? classType이 추상 형식을 가리 킵니까? 런타임 검사를 수행 할 수 있습니다 : 같은 컴파일 시간에 수행 될 수자바 추상 ​​형식 클래스 컴파일 시간 검사

void foo(Class<? extends SubType> classType) { 
    Modifier.isAbstract(classType.getModifiers()); 
} 

foo(AbstractType.class); // this should pass 
foo(NotAbstractType.class); // this should fail 

경우?

+0

는 당신이 우리에게 당신이 컴파일시에 유형을 확인하려는 이유를 알려 주시기 바랍니다 수 :

는 주석은, 처리에이 질문을 참조하십시오? 런타임에 형식을 찾는 것이 대부분의 프로그래머가 염려하는 것입니다. (오버라이드 된 메서드가 아닌) 많은 특정 메서드가있는 다른 구현이있을 수 있기 때문에 –

+0

메서드는 전용 멤버에서이 형식의 개체를 찾기 위해 형식 정보가 필요합니다. 그 추상적 인 하위 클래스 유형은 구현 그 자체가 아닌 가능한 구현 그룹을 정의해야하므로 인수가 추상 유형인지 컴파일 시간 확인을 통해 사용 실수를 막을 수 있습니다. – lietus

답변

0

내 지식으로는 자동 해결 방법이 없습니다.

그러나 foo 메서드에 전달 된 클래스 목록을 미리 알고 있다면 수동 솔루션을 구현할 수 있습니다. 즉

private ArrayList<Class> abstractTypes = new ArrayList<>(); 

void foo(Class<? extends SubType> classType) { 
    boolean isAbstract = false; 
    for(Class c: abstractTypes) 
     if((classType.getName()).equals(c.getName()){ 
      isAbstract = true; 
      break; 
     } 

    //Do something else... 
} 
3

당신은 당신의 자신의 @MustBeAbstract 주석은, 다음이 주석은, 어떤 클래스가 추상적 인 것을 강제 주석은, 프로세서를 작성할 수 있습니다. What is annotation processing in Java?

관련 문제