Java 调用接受类的泛型方法时,如何返回特定类型的列表<;T>;返回一个T?
我正在使用此签名从库中调用一个方法:Java 调用接受类的泛型方法时,如何返回特定类型的列表<;T>;返回一个T?,java,generics,casting,warnings,Java,Generics,Casting,Warnings,我正在使用此签名从库中调用一个方法: public <T> T get(Class<T> c) public-T-get(c类) 我想得到一个列表作为返回值。但这样调用它不会编译(“无法从参数化类型中选择”): List myClasses=get(List.class); 这会编译,但会发出警告: List<MyClass> myClasses = get(List.class); List myClasses=get(List.class); 警
public <T> T get(Class<T> c)
public-T-get(c类)
我想得到一个列表
作为返回值。但这样调用它不会编译(“无法从参数化类型中选择”):
List myClasses=get(List.class);
这会编译,但会发出警告:
List<MyClass> myClasses = get(List.class);
List myClasses=get(List.class);
警告显示“未经检查的分配”。如何避免此警告并避免强制转换列表?您在此处使用泛型,因此列表中的基本项类型在运行时已被删除,编译器知道它无法在编译时为您检查,因此警告无效。如果在此处使用泛型类型,则无法避免警告。如果您确信您正在执行的强制转换不会导致异常,则可以抑制它
@SuppressWarnings("unchecked")
注意:我发表这篇文章更多的是出于兴趣,而不是作为推荐答案。一般来说,你最好干脆不发出警告
如果你真的不喜欢压制警告,但也不喜欢看到警告,那么除了公认的答案之外,还有一种黑客的替代方法。您可以实例化一个archetype对象,例如ArrayList
,然后将archetype.getClass()
传递到泛型方法中,而不是像示例和接受的答案中那样传递到List.class
这看起来像:
ArrayList<MyClass> archetype = new ArrayList<>();
List<MyClass> myClasses = get(archetype.getClass());
ArrayList原型=新的ArrayList();
List myClasses=get(archetype.getClass());
这里一个明显的缺点是实例化原型对象的不必要成本,但是通过使其成为静态实例,可以在一定程度上减轻这一成本。据我估计,一个更大的缺点是您必须使用一个具体的类作为原型,这可能是不必要的限制
ArrayList<MyClass> archetype = new ArrayList<>();
List<MyClass> myClasses = get(archetype.getClass());