如何在调用接受Class <t>并返回T的泛型方法时返回某个类型的列表?</t>

时间:2013-05-13 20:00:47

标签: java generics casting warnings

我正在使用此签名从库中调用方法:

public <T> T get(Class<T> c)

我希望得到一个List<MyClass>作为返回值。但是这样调用它不会编译(“无法从参数化类型中选择”):

List<MyClass> myClasses = get(List<MyClass>.class);

这会编译,但会发出警告:

List<MyClass> myClasses = get(List.class);

警告显示“未经检查的分配”。如何避免此警告并避免将我的列表投射?

2 个答案:

答案 0 :(得分:3)

您在这里使用泛型,因此列表中的基础类型项已在运行时被擦除,编译器知道它无法在编译时为您检查它,因此警告。如果您在此处使用通用类型,则无法避免警告。如果你确定你正在做的演员表不会导致异常,你可以压制它。

@SuppressWarnings("unchecked")

答案 1 :(得分:1)

注意 :我将此更多信息发布为兴趣点而不是推荐答案。你最好只是简单地抑制警告。

如果你真的讨厌抑制警告,但你也讨厌看到警告,那么接受的答案就会有一个hacky替代品。您可以实例化一个原型对象,例如ArrayList<MyClass>,然后将archetype.getClass()传递给泛型方法,而不是List.class,如示例和接受的答案中所做的那样。

这看起来像是:

ArrayList<MyClass> archetype = new ArrayList<>();
List<MyClass> myClasses = get(archetype.getClass());

这里一个明显的缺点是实例化原型对象的不必要的成本,但这可以通过使其成为静态实例来稍微减轻。在我的估计中,一个更大的缺点是你必须使用一个具体的类作为你的原型,这可能是不必要的限制。