2017-11-15 1 views
0

특정 SomeInterface이 있고이 인터페이스를 구현하는 클래스가 여러 개 있습니다. 모든 클래스에는 인터페이스에 의해 정의되지 않은 someMethod()이 있습니다.다운 캐스트 클래스의 메서드 호출

변수 someVariable()을 가지고 있는데 someMethod() (으)로 전화하고 싶습니다. 그것을 할 수있는 한 가지 방법은 SomeInterfaceSomeInterface을 구현하는 SomeClass에 다운 캐스트와 같은 그것에 someMethod를 호출하는 것입니다 :

((SomeClass) someVariable).someMethod() 

을하지만 SomeInterface를 구현하는 클래스 중 하나가 someVariable에 저장되어있는 모른다. 기본 클래스에서 구현되었지만 코딩 할 인터페이스에 의해 정의되지 않은 메서드를 호출하는 대체 방법은 무엇입니까?

+0

당신을 도울 수있는 포인터가있다 : 만약 (SomeClass instanceof를 OBJ) { ((SomeClass) someVariable) .someMethod() } 다른 경우 (SomeClass2 instanceof를 obj를) {.... –

답변

1

를 호출하기 전에 더러운 솔루션은 아직 최적화되지 instanceof 조금 덜 더럽 사용하여 반사를 사용하는 것입니다,하지만. 최소한의 해결책은 someMethod()으로 다른 인터페이스를 만들고 클래스가 해당 인터페이스를 구현하도록하는 것입니다. 그런 다음 해당 인터페이스로 캐스팅하고 메서드를 호출 할 수 있습니다.

((SomeInterface) someVariable).someMethod(); 

물론이 질문에는 해당 클래스를 수정할 수 있어야합니다.

+0

불행히도, 난 드릴 수 없습니다 이 프로젝트는 외부 프로젝트이므로 변경하려면 모든 옵션을 마련해 주셔서 감사합니다. 이것은 매우 도움이된다. –

1

당신은 방법

public static void main(String[] args) { 
     TestI t = new Test(); 
     Class c = t.getClass(); 

     try { 
      Method m = c.getDeclaredMethod("someMethod"); 
      m.invoke(t); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
다음 TestI

거기에 someMethod이없는 인터페이스입니다에게 전화 반사를 사용할 수 있습니다. 리플렉션을 사용하여 클래스의 메소드를 가져오고 오브젝트에 someMethod 메소드를 호출하십시오.

1

당신은 someVariableSomeClass 인스턴스를 저장 여부를 확인할 수 있습니다 someMethod

if (someVariable instanceof SomeClass) { 
    ((SomeClass)someVariable).someMethod(); 
} else { 
    // do something else 
}