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

Java泛型-我可以根据变量类型动态创建列表吗,java,generics,Java,Generics,是否有任何方法可以在运行时创建泛型类型的特定实例 比如说 Cacheable instance = getCacheable(someInput); getCacheble方法将返回Cacheable的实例。所以它可以是任何实现Cacheable的类。例如,Customer、Product等。现在我想创建一个getCacheable返回的特定类型的列表,如下所示。这可能吗?如果是,怎么做 List<? extends Cacheable> cacheList = new Array

是否有任何方法可以在运行时创建泛型类型的特定实例

比如说

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

List<? extends Cacheable> cacheList = new ArrayList<>();
List您可以执行以下操作:

Cacheable instance = getCacheable(someInput);
List<? extends Cacheable> l = new ArrayList<>();
l = Collections.checkedList(l, instance.getClass());
if(产品实例){
//创建ArrayList;
}否则{
//创建ArrayList;
}

但这并不是真正的通用性和动态性。

唯一的方法是打开
实例的类型,但您无法对其进行太多操作:

List<? extends Cacheable> cacheList = null;
if (instance instanceof Product)
  cacheList = new ArrayList<Product>();
// etc

List使用通用助手函数:

public static <T extends Cacheable>ArrayList<T> createList(Class<T> claz)
{
       return new ArrayList<>();
}

ArrayList<? extends Cacheable>alist = createList(instance.getClass());
publicstaticarraylistcreatelist(claz类)
{
返回新的ArrayList();
}

ArrayList但我更喜欢Alex的答案。谢谢你的回答。问题是我实际上没有使用List,它是我自己的自定义泛型类。我以List为例来简化prob语句。@Jai是你自己的自定义泛型类是
集合
()?如果是这样,您可以使用
checkedCollection
而不是
checkedList
。否。它不是集合。我想在这里避免check的实例,但我认为这是不可能的。@Jai如果您想避免check的实例,我已经添加了一个替代选项。@Alex,事实上,我在更新之前的回答中提出了这一点,当时我注意到您提到了内置方法:)由于擦除,这有点不合理,因为列表在运行时没有类型。泛型用于编译时检查。因此,真正的答案取决于您的实际用例。为什么需要编译时检查以及如何进行?在运行时,您可以将任何内容放入任何列表中,泛型仅充当网关守卫。请注意,参数
claz
未使用,可以删除。@PaulBellora,从实例自身的类型推断类型不是必需的吗。我知道,由于
alist
具有类型
ArrayListType,因此在编译时会发生推断。如果失败,可以手动指定类型参数,例如
MyClass.createList()
。但考虑到泛型类型在运行时已被删除,OP要求的内容没有意义
createList(instance.getClass())
可以简化为
new ArrayList()
,因为在运行时,它只是
ArrayList
@PaulBellora,这不仅仅是因为,使用
ArrayList,Java 6不支持菱形运算符。(同意6是很久以前的事了)
List<? extends Cacheable> cacheList = null;
if (instance instanceof Product)
  cacheList = new ArrayList<Product>();
// etc
public static <T extends Cacheable>ArrayList<T> createList(Class<T> claz)
{
       return new ArrayList<>();
}

ArrayList<? extends Cacheable>alist = createList(instance.getClass());