2014-07-07 39 views
0

我想通過Class類型來檢索實例。但現在我正在努力與泛型。我的代碼不起作用,實際上我不知道爲什麼。那就是:用碎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類下面是我持有人實現了一套。

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'方法的返回類型缺失。使用'公衆 T創建(...)' – 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

相關問題