2013-05-25 4 views
1

내 인터페이스에 제네릭 형식 인수가 있습니다. 인터페이스를 구현하는 모든 클래스는이 유형을 선언해야하므로 나중에 사용하는 사용자는 다시 얻은 정보를 알 수 있습니다. 이제는 이러한 클래스에서 instanceof를 사용하여 해당 인스턴스가 Action의 인스턴스인지 확인해야합니다.인터페이스 generics 및 instanceof

내 질문은 :이 SomeAction 클래스

if (SomeAction instanceof Action<?>) { 
    . . . 

} 

을 : 내가 그랬다면 어떤 일이 instanceof를 반환합니다

public class SomeAction implements Action<String> { 
    . . . 

} 

그것은 사실 또는 거짓을 반환 할 것인가? 그리고 만약 내가 그랬다면 무엇을 SomeAction instanceof Action<Integer>

+4

시도해 보셨습니까? – Keppil

답변

3

instanceof을 사용할 때 Java는 일반적인 유형을 신경 쓰지 않습니다. Javadocs 인용하자면 : 자바 컴파일러는 일반적인 코드의 모든 유형 매개 변수가 지워지기 때문에

을, 당신은 당신이 할 수있는,

그래서 런타임에 사용되는 일반적인 유형의 매개 변수 유형을 확인할 수 없습니다 Action<?> 또는 Action을 테스트하지만 Action<Integer>을 테스트하려고하면 컴파일러 오류가 발생합니다. 오류 메시지는 매우 유익합니다.

매개 변수화 된 유형에 대해 instanceof 확인을 수행 할 수 없습니다. 조치 < 정수>. 양식 작업 <를 사용?> 더 일반적인 유형 정보가 런타임

+0

좋습니다. 아주 명확합니다. 실제로 뒤에 남겨 두는 것이 더 나은가요? 그렇지 않으면 아무런 차이가 없습니까? – Creator13

+0

@ Creator13 : 내가 아는 한 전혀 차이가 없지만 오류 메시지가 ''구문을 선호하기 때문에 나는 그것에 충실 할 것이다. – Keppil

0

나는 그것을 구현에서 삭제됩니다하고 true를 반환하는 대신 때문이다. 또한

이처럼 모두 함께 제네릭을 떠날 경우 :

if (SomeAction instanceof Action) { 
    . . . 

} 

실제로 메시지와 함께 코드가 컴파일되지 않는 경우 운전 행동에 대한 일반적인 유형을 포함하려고하면 : 예를 들어

의 예를 들어

불법 제네릭 형식 :

if (action instanceof Action<String>) { 
      System.out.println("is Action"); 
} else { 
      System.out.println("is not Action"); 
}