我们有什么方法可以在运行时创建泛型类型的特定实例?
例如。
Cacheable instance = getCacheable(someInput);
getCacheble方法将返回Cacheable的实例。所以它可以是任何实现Cacheable的类。例如,客户,产品等。现在我想创建一个getCacheable返回的特定类型的列表,如下所示。这可能吗?如果是的话怎么做?
List<? extends Cacheable> cacheList = new ArrayList<>();
我想根据getCacheable方法返回的实例创建ArrayList<Product> or ArrayList<Customer>
。
答案 0 :(得分:6)
你可以这样做:
Cacheable instance = getCacheable(someInput);
List<? extends Cacheable> l = new ArrayList<>();
l = Collections.checkedList(l, instance.getClass());
由于类型擦除,编译时可访问的所有信息在运行时都会丢失。
checkedList
方法将确保您的列表仅接收instance
变量类的实例。
<强>更新强> 你也可以这样做:
public static <T extends Cacheable> MyOwnCustomGeneric<T> createMyOwnCustomGeneric(Class<T> type) {
return new MyOwnCustomGeneric<T>();
}
// ...
IMyOwnCustomGeneric foo = createMyOwnCustomGeneric(instance.getClass());
答案 1 :(得分:2)
使用通用帮助函数:
public static <T extends Cacheable>ArrayList<T> createList(Class<T> claz)
{
return new ArrayList<>();
}
ArrayList<? extends Cacheable>alist = createList(instance.getClass());
答案 2 :(得分:0)
if (instance instanceof Product) {
// create ArrayList<Product>;
} else {
// create ArrayList<Customer>;
}
但这并不是一般的和动态的。
答案 3 :(得分:0)
唯一的方法是打开instance
的类型,但你可以用它做的不多:
List<? extends Cacheable> cacheList = null;
if (instance instanceof Product)
cacheList = new ArrayList<Product>();
// etc
但你能用这个清单做什么呢?你不能添加任何东西。也许您在创建项目时会向其添加项目,但这可能不是用例,因为它是缓存列表。
如果您以后需要向其中添加项目,请参阅this answer是正确的方法。
如果您以后不再添加项目,则类型为List<Cacheable>
或List<? extends Cacheable>