【发布时间】:2013-05-20 01:26:54
【问题描述】:
我有一个通用接口,我们称之为GenericInterface<T>。我需要将该接口的 类对象 传递给期望(通过另一个类型参数指定)该类型的特定实例的方法。假设我想打电话给java.util.Collections.checkedList():
List<GenericInterface<Integer>> list = Collections.checkedList(
new ArrayList<GenericInterface<Integer>>(),
GenericInterface.class);
这不起作用,因为Class<GenericInterface> 不能隐式转换为Class<GenericInterface<Integer>>,那么最安全的方法是什么?我能想到的最好的是:
List<GenericInterface<Integer>> list = Collections.checkedList(
new ArrayList<GenericInterface<Integer>>(),
(Class<GenericInterface<Integer>>) (Class<?>) GenericInterface.class);
它有效,但不会保护我免受例如将列表的类型更改为List<SomeOtherInterface>,而不用SomeOtherInterface.class 替换类对象参数。
【问题讨论】:
-
我知道在这个例子中,checked 列表实际上不会检查添加到列表中的
GenericInterface实例的类型参数T,这不是我想要的。如果可能的话,我只是希望对checkedList()的调用更加类型安全。 -
这是你能做的最好的事情
-
这是一个完美的例子,说明你可以只做未经检查的演员表并压制它。您正在控制委托列表的创建,因此无需担心。但是 Java 不能让你不抱怨就去做,因为据它所知,强制转换可能会导致类型错误。