在java中,泛型類型參數信息在運行時不可用。因此,在Create()方法是不可能的,從類型參數T獲得相應的Class對象如果你想有這樣的工廠,你可以有一個類型的提供者接口
public interface IProvider<T extends IBase> {
T getInstance();
}
然後用HashMap<Class<? extends IBase>, IFactory<? extends IBase>>
維護工廠清單。所以,你可以調用下面的方法來獲得一個新的實例:
private HashMap<Class<? extends IBase>, IFactory<? extends IBase>> map;
@SuppressWarnings("unchecked")
public <T> T create(Class<T> type) {
return (T) map.get(type).getInstance();
}
要使用create(Class<?>)
方法,例如,你怎麼稱呼它,如下所示:
ISomeInterface someObject = create(ISomeInterface.class);
請注意,這是你的責任,以確定密鑰類型與工廠的返回類型map
匹配,否則將引發ClassCastException。
如果您不需要創建的類型擴展爲IBase
,只需省略代碼片段中的所有extends IBase
即可。
這裏有一個完整的例子:
package com.example.playground;
import java.util.HashMap;
public class TypeFactory {
public interface IBase { }
public interface IProvider <T extends IBase> {
T getInstance();
}
private HashMap<Class<? extends IBase>, IProvider<? extends IBase>> registry =
new HashMap<>();
public <T extends IBase> void addProvider(Class<T> type, IProvider<T> provider) {
registry.put(type, provider);
}
@SuppressWarnings("unchecked")
public <T extends IBase> T create(Class<T> type) {
return (T) registry.get(type).getInstance();
}
public static void main(String[] args) {
TypeFactory factory = new TypeFactory();
factory.addProvider(ISomeInterface.class, new IProvider<ISomeInterface>() {
@Override
public ISomeInterface getInstance() {
return new ISomeInterface() {
@Override
public String toString() {
return "I'm a class that implements ISomeInterface";
}
};
}
});
ISomeInterface obj = factory.create(ISomeInterface.class);
System.out.println(obj);
}
}
interface ISomeInterface extends TypeFactory.IBase { }
類型都可以通用? –
不,唯一允許的類型是從一些基本接口繼承的接口。 (有一個約束 - 其中T:廣積) – AntonKam