Java Generics-我可以根据变量类型动态创建列表

时间:2013-12-11 22:56:17

标签: java generics

我们有什么方法可以在运行时创建泛型类型的特定实例?

例如。

Cacheable instance = getCacheable(someInput);

getCacheble方法将返回Cacheable的实例。所以它可以是任何实现Cacheable的类。例如,客户,产品等。现在我想创建一个getCacheable返回的特定类型的列表,如下所示。这可能吗?如果是的话怎么做?

List<? extends Cacheable> cacheList = new ArrayList<>();

我想根据getCacheable方法返回的实例创建ArrayList<Product> or ArrayList<Customer>

4 个答案:

答案 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>

并不重要