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

JRR*_*JRR 3 java generics

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

例如.

Cacheable instance = getCacheable(someInput);
Run Code Online (Sandbox Code Playgroud)

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

List<? extends Cacheable> cacheList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我想ArrayList<Product> or ArrayList<Customer>基于getCacheable方法返回的实例创建.

Ste*_*han 6

你可以这样做:

Cacheable instance = getCacheable(someInput);
List<? extends Cacheable> l = new ArrayList<>();
l = Collections.checkedList(l, instance.getClass());
Run Code Online (Sandbox Code Playgroud)

由于类型擦除,编译时可访问的所有信息在运行时都会丢失.该checkedList方法将确保您的列表仅接收instance变量类的实例.

更新: 你也可以这样做:

public static <T extends Cacheable> MyOwnCustomGeneric<T> createMyOwnCustomGeneric(Class<T> type) {
    return new MyOwnCustomGeneric<T>();
}

// ...
IMyOwnCustomGeneric foo = createMyOwnCustomGeneric(instance.getClass());
Run Code Online (Sandbox Code Playgroud)