我正在使用此签名从库中调用方法:
public <T> T get(Class<T> c)
我希望得到一个List<MyClass>
作为返回值。但是这样调用它不会编译(“无法从参数化类型中选择”):
List<MyClass> myClasses = get(List<MyClass>.class);
这会编译,但会发出警告:
List<MyClass> myClasses = get(List.class);
警告显示“未经检查的分配”。如何避免此警告并避免将我的列表投射?
答案 0 :(得分:3)
您在这里使用泛型,因此列表中的基础类型项已在运行时被擦除,编译器知道它无法在编译时为您检查它,因此警告。如果您在此处使用通用类型,则无法避免警告。如果你确定你正在做的演员表不会导致异常,你可以压制它。
@SuppressWarnings("unchecked")
答案 1 :(得分:1)
注意 :我将此更多信息发布为兴趣点而不是推荐答案。你最好只是简单地抑制警告。
如果你真的讨厌抑制警告,但你也讨厌看到警告,那么接受的答案就会有一个hacky替代品。您可以实例化一个原型对象,例如ArrayList<MyClass>
,然后将archetype.getClass()
传递给泛型方法,而不是List.class
,如示例和接受的答案中所做的那样。
这看起来像是:
ArrayList<MyClass> archetype = new ArrayList<>();
List<MyClass> myClasses = get(archetype.getClass());
这里一个明显的缺点是实例化原型对象的不必要的成本,但这可以通过使其成为静态实例来稍微减轻。在我的估计中,一个更大的缺点是你必须使用一个具体的类作为你的原型,这可能是不必要的限制。