2014-07-07 2 views
0

클래스 유형별로 인스턴스를 검색하고 싶습니다. 그러나 지금은 제네릭으로 고심하고 있습니다. 내 코드가 작동하지 않고 실제로 이유를 알지 못합니다. 여기있다 : 깨진 create 방법Reflection API를 사용하여 인스턴스를 반환하는 메소드를 적절하게 생성하는 방법은 무엇입니까?

public class Provider { 
    private String property; 

    public Provider(String property) { 
     this.property = property; 
    } 

    public <T> create (Class<T> type) throws Exception { 
     return type.getConstructor(String.class).newInstance(property); 
    } 
} 

public class Main { 
    public static void main(String[] args) throws Exception { 
     Provider provider = new Provider("prop"); 
     AbstractHolder obj = provider.create(DefaultHolder.class); 
     System.out.println(obj.getProperty()); 
    } 
} 

Provider 클래스가 여기 내 홀더 IMPL입니다.

public class DefaultHolder extends AbstractHolder { 
    public DefaultHolder(String field) { 
     super(field); 
    } 
} 

그리고 AbstractHolder 추상 클래스.

public abstract class AbstractHolder { 
    private String property; 

    public AbstractHolder(String property) { 
     this.property = property; 
    } 

    public String getProperty() { 
     return property; 
    } 
} 

어떻게하면 내 공급자 클래스에서 제네릭을 수정할 수 있습니까?

PS

문제는이 방법

public <T> create (Class<T> type) throws Exception { 
    return type.getConstructor(String.class).newInstance(property); 
} 
+0

유일한 문제는'create' 메소드의 반환 형식이없는 점이다. 'public T create (...) '를 사용하십시오. – Marco13

+0

예, 감사합니다. – Aaron

답변

0

에 이것을 시도 :

public class Main { 
    public static void main(String[] args) throws Exception { 
     Provider provider = new Provider("prop"); 
     AbstractHolder obj = provider.create(DefaultHolder.class); 
     System.out.println(obj.getProperty()); 
    } 
} 

public class Provider { 
    private String property; 

    public Provider(String property) { 
     this.property = property; 
    } 

    public <T extends AbstractHolder> T create(Class<T> type) throws InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException { 
     return type.getConstructor(property.getClass()).newInstance(property); 
    } 
} 
+0

'Provider (String property)'생성자를 수정할 수 없습니다. 나는'create()'메서드 만 변경할 수있다. – Aaron

+0

생성자 정의 유지 편집 된 답변 – rob

+0

네, 도와 줘서 고마워. – Aaron

관련 문제