Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用接受类的泛型方法时,如何返回特定类型的列表<;T>;返回一个T?_Java_Generics_Casting_Warnings - Fatal编程技术网

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());