7

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

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

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

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

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

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

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

4

2 回答 2

3

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

@SuppressWarnings("unchecked")
于 2013-05-13T20:07:00.147 回答
1

注意:我将其发布为兴趣点而不是推荐答案。你通常最好简单地抑制警告。

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

这看起来像:

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

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

于 2017-01-27T01:44:40.153 回答