2012-12-24 2 views
4

일반 인터페이스를 호출 : 일반적인 서명 추상 메소드를 재정의하고 그것을

public interface Matcher<T> { 
    public double getScore(T value1, T value2); 
} 

두 구현하는 클래스 :

public StringMatcher implements Matcher<String> { 
    public double getScore(String value1, String value2) {...} 
} 

public DateMatcher implements Matcher<Date> { 
    public double getScore(Date value1, Date value2) {...} 
} 

지금까지 모든 것이 괜찮습니다. TString 또는 Date으로 바꾸는 것은 문제가되지 않습니다. 작동 또한 다음과 같이 getScore() 메서드를 호출 : 나는 알 수없는 MatcherList을 가지고 있고 나는 getScore() 방법을 사용하고자 할 때

Matcher<String> matcher = new StringMatcher(); 
matcher.getScore("hello", "world"); 

문제가 시작됩니다.

public void test() { 
    List<Matcher<?>> list = new ArrayList<Matcher<?>>(); 
    list.add(new StringMatcher()); 
    list.add(new DateMatcher()); 

    for (Matcher<?> matcher : list) { 
     Object value1; 
     Object value2; 
     //Setting values value1 & value2 appropriate to the current matcher 
     matcher.getScore(value1, value2); 
    } 
} 

개체 매개 변수를 처리 할 수 ​​없기 때문에 matcher.getScore(value1, value2)을 호출 할 수 없습니다. 그리고이 시점에서 나는 이것을 어떻게 풀어야할지 모른다. 구현 클래스의 인터페이스와 서명을 구체적인 유형으로 유지하려고합니다. 캐스팅 또는 예외를 throw하는 것이 주위에 아무 것도 없다면 괜찮습니다.

답변

8

유형 안전을 원하고 원하지 않으려는 경우 충돌이 발생하므로 두 유형 사이에서 결정해야합니다. 인수가 ObjectgetScore을 호출하는 것은 분명히 유형이 안전하지 않습니다.

이제 형식이 안전하지 않은 트릭을 컴파일러/런타임 오류가 발생하지 않도록하려면 List<Matcher>으로 목록을 선언 할 수 있습니다. 즉, Matcher을 원시로 검색하면됩니다. 당신이 체크되지 않은 캐스트 컴파일러 경고를 얻을 것입니다 Object 인치에 전달할 수 있습니다.

+0

+1. 너는 나보다 빨랐어. Object 인스턴스를 비교하려면 Matcher 이 필요합니다. Matcher의 다른 유형은 Object 인스턴스를 모르는 경우 Object 인스턴스를 비교할 때 예외를 던질 가능성이 큽니다. –

+0

고마워, 정확히 내가 알 필요가있는 thats. –

0

그것은 당신이 (말 T을)를 정규의 매개 변수 유형을 사용할 수 있도록 캡처 도우미를 사용하는 것이 가장 좋은, 그리고 value1value2 해당 유형 T으로 선언 될 것입니다.

private <T> double helper(Matcher<T> matcher) { 
    T value1; 
    T value2; 
    //Setting values value1 & value2 appropriate to the current matcher 
    return matcher.getScore(val1, val2); 
} 

public void test() 
{ 
    List<Matcher<?>> list = new ArrayList<Matcher<?>>(); 
    list.add(new StringMatcher()); 
    list.add(new DateMatcher()); 

    for (Matcher<?> matcher : list) { 
     helper(matcher); 
    } 
} 
관련 문제