2010-02-24 7 views
2

누군가 제네릭을 도와주세요!자바 제네릭 히스테릭

인자가 될 수있는 다른 유형의 오버로드 된 메소드가 있다면 런타임시 올바른 메소드를 호출 할 수있는 일반적인 메소드를 작성할 수 있습니까?

public interface CoolInterface { 
    setOverloadedValue(String o); 
    setOverloadedValue(Integer o); 
    setOverloadedValue(Date o); 
} 

public interface ClazzProvider { 
    Class getClazz(); 
} 

public class SomeUncoolClass { 

    @AutowiredMagic CoolInterface coolGuy; 
    @AutowiredMagic ClazzProvider clazzyProvider; 

    public void helpMeMethod() { 
     coolGuy.setOverloadedValue(getValue(clazzyProvider.getClazz())); 
    } 

    private ??? getValue(???) { 
     return ???; 
    } 
} 

getValue의 방법 서명()가 무엇인가

예 (미안 내 자바-nology는 만약 그렇다면, 빈약 한 경우)? 어떻게 구현할 수 있습니까?

+0

이 코드는 무엇을해야합니까? getValue()는 매개 변수로 가져온 클래스에서 무엇을 반환해야합니까? –

답변

6

아니요 - 컴파일시 오버로드가 선택되며 컴파일러에서 어떤 오버로드를 사용할지 알 수 없습니다.

허용하려는 유형이 사용자의 통제하에있는 경우에 대한 해결책으로 Visitor Pattern을보고 싶을 수 있습니다. 문자열/날짜/객체를 허용하려는 경우에는별로 도움이되지 않습니다. 즉 자바 제네릭 때문에 불가능하기 때문에 :(

+0

어떻게 해결할 수 있습니까? –

+0

@ChloeRadshaw : 같은 종류의 문제에 대해서는 약간 다른 접근 방식입니다. String/Integer/Date를 타겟으로 사용하는 것은 도움이되지 않지만 유사한 상황에있는 다른 사람들에게는 대안입니다. 더 명확하게 편집 할 것입니다. –

1
당신은 조슈아 블로흐는 효과적인 자바 2 판의 형태 보증 된 이기종 용기 (THC)를 호출하는 것과 비슷한 작업을 수행 할 수

.

import java.util.*; 

class TypesafeHeterogenousContainer { 
    Map<Class<?>, Object> map = new HashMap<Class<?>, Object>(); 

    public <T> T get(Class<T> klass) { 
     return klass.cast(map.get(klass)); 
    } 

    public <T> void put(Class<T> klass, T thing) { 
     map.put(klass, thing); 
    } 
} 

public class Main { 
    public static void main(String args[]) { 
     TypesafeHeterogenousContainer thc = new TypesafeHeterogenousContainer(); 
     thc.put(String.class, "a string"); 
     thc.put(Integer.class, 5); 
     System.out.println(thc.get(String.class)); // prints "a string" 

     thc.put(String.class, 5); // compile-time error 
    } 
} 

이 정확히 과부하에 의해 수행되지 않습니다 형식 지우기를 사용하므로 대신에 Class<?> 객체를 전달해야합니다. 실행시 d.

이 책이나 온라인의 다른 일부 페이지에서 자세한 내용을 볼 수 있습니다. 이 책이없는 경우 An application of typesafe heterogeneous containers

  • Neal Gafter's Blog: Super Type Tokens
  • A type-safe heterogeneous container for parameters that validates the parameter
    • ... 등

    , 당신은 자바 하나 PDF에서 자신의 2006 프레 젠 테이션에서 읽을 수 있습니다.

  • +1

    링크를 제공해 주셔서 감사합니다. 그들은 훌륭한 읽을 거리였습니다! – JavaRocky

    +0

    환영합니다 = 이상) – polygenelubricants

    1

    Jon Skeet이 말했듯이, 제네릭은이 경우 도움이되지 않습니다.

    polimorphic paramers가 다른 메소드 실행을 필요로하는 일부 상황에 도움이되는 Visitor 패턴을 볼 수 있습니다. 그러나 WATCH OUT : 유형 계층이 안정적 일 때만 도움이됩니다. 이 유형의 불안정한 목록 일반적인 처리를 원하는, 또는 방문자 패턴의 복잡성을 좋아하지 않는 경우에

    이, 나는이 Map<Class, ValueProcessor> 추천한다 :

    private [static?] Map<Class, ValueProcessor> processors = new HashMap<Class, ValueProcessor>(); 
    
    // initialization 
    processors.put(Integer.class, new ValueProcessor() { 
        public void process(Object value) { 
         doStuffWith((Integer) value); 
        } 
    }); 
    
    processors.put(Date.class, new ValueProcessor() { 
        public void process(Object value) { 
         doStuffWith((Date) value); 
        } 
    }); 
    
    // and so on... 
    
    public interface ValueProcessor { 
        public void process(Object value); 
    } 
    
    2

    잘 모르겠어요 무엇 긴장 이 코드의 내용은 다음과 같습니다.

    public interface CoolInterface<T> { 
        void setOverloadedValue(T o); 
    } 
    
    public interface ValueProvider<T> { 
        T getValue(); 
    } 
    
    public class SomeUncoolClass<T> { 
    
        private CoolInterface<? super T> coolGuy; 
        private ValueProvider<? extends T> valueProvider; 
    
        public void helpMeMethod() { 
         coolGuy.setOverloadedValue(valueProvider.getValue()); 
        } 
    }