2010-12-07 5 views
1

Java : generics의 다양한 인터페이스

두 메소드 (A와 B)가 동일한 메소드 (foo)를 가지고 있습니다.

public class A { 
public String foo() { 
    return "A said foo"; 
} 
} 

public class B { 
public String foo() { 
    return "B said foo"; 
} 
} 

이 메소드를 호출 할 수있는 일반 클래스를 만들고 싶습니다. 하지만 런타임에이 작업을 수행하는 방법과 컴파일 시간에 대한 아이디어가 없습니다.

  1. 형식을 확인하고 A 또는 B로 캐스팅합니다.

  2. 메서드를 가져옵니다.

getMethod를 호출하는 제네릭 예제 :

public class Template<T> { 
private T mT; 

public Template(T t) { 
    mT = t; 
} 

    public String bar() { 
    String result = "no result"; 
    try { 
     Method m = mT.getClass().getMethod("foo", null); 
    result = (String)m.invoke(mT); 
    } catch (Exception e) { 
    result = e.toString(); 
    e.printStackTrace(); 
    } 
    return result; 
    } 
} 

다른 방법이 있습니까? 나는 다음과 같은 것을 찾고있다.

public class Template<T extends A | B> { 
... 
} 

나는 "A"와 "B"클래스의 창조자가 아니다.

답변

5

두 클래스 모두 foo 메소드를 선언하는 공통 인터페이스를 구현해야합니다. Java는 "duck typing"을 지원하지 않습니다.

+0

실제로. 인터페이스 (또는 수퍼 클래스)가 없으면이를 수행하는 * 유일한 * 방법은 반사, 제네릭 또는 아니오를 통해 이루어집니다. –

0

당신은 아마 당신은 다음 인수로이 클래스를 사용하거나 와일드 카드 제네릭에 머물 ABAbstract로 전송할 수 있습니다 A와 B 에 대한 부모 유형으로 클래스 ABAbstract을 만들 수 있습니다. 또한 클래스 A와 B가 foo 메소드를 선언하는 인터페이스를 구현하도록 할 수 있습니다. 이것은 아마도 컴파일을하는 가장 쉬운 방법 일 것이고 오류를 던지지 않고 "당신이 찾고있는"말과 정확히 일치 할 것입니다.

하지만 thinky OU를 작성해야합니다 :

public class Template<T extends ABInterface> { 

을하지만 난 확실히 이것에 대해 확실하지 않다. 클래스가 구현 도구 키워드를 사용해야하는 경우도 있습니다.

4

인터페이스를 만들고 인터페이스를 구현하는 클래스를 템플릿에서 허용해야합니다.

interface Foo{ 
    public String foo(); 
} 

public class A implements Foo { 
    public String foo() { 
     return "A said foo"; 
    } 
} 

public class B implements Foo{ 
    public String foo() { 
     return "B said foo"; 
    } 
} 

public class Template<T extends Foo> { 
    private T mT; 

    public Template(T t) { 
     mT = t; 
    } 
    public String bar() { 
     return mT.foo(); 
    } 
} 
+0

나는 A 클래스와 B 클래스의 제작자가 아니다. – Vlad

관련 문제