如何迭代通配符泛型?基本上我想内联以下方法:
private <T extends Fact> void iterateFacts(FactManager<T> factManager) {
for (T fact : factManager) {
factManager.doSomething(fact);
}
}
如果此代码位于如图所示的单独方法中,则它可以工作,因为通用方法上下文允许定义通配符类型(此处T
) 可以对其进行迭代。如果尝试内联此方法,方法上下文就会消失,并且无法再迭代通配符类型。即使在 Eclipse 中自动执行此操作也会失败,并显示以下(无法编译的)代码:
...
for (FactManager<?> factManager : factManagers) {
...
for ( fact : factManager) {
factManager.doSomething(fact);
}
...
}
...
我的问题很简单:有没有一种方法可以放置一些可以迭代的通配符类型,或者这是泛型的限制(意味着不可能这样做)?
不。在这种情况下,解决方法是创建一个辅助方法。
JLS有这个例子http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.10
public static void reverse(List<?> list) { rev(list);}
private static <T> void rev(List<T> list) { ... }
问题是,我们有一个List<?>
目的。我们知道它一定是一个List<X>
一些中的X
,我们想使用编写代码X
。内部编译器确实将通配符转换为类型变量X
,但是Java语言并没有为程序员提供直接访问它的方法。但如果有一种方法接受List<T>
,我们可以将对象传递给方法。编译器推断T=X
并且通话效果良好。
如果没有类型擦除,X
可以在运行时知道,那么Java肯定会给我们一种访问的方法X
。然而从今天开始X
在运行时不可用,没有多大意义。可以提供一种纯粹的合成方法,这不可能比辅助方法解决方法更简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)