【发布时间】:2011-09-10 10:43:24
【问题描述】:
如何迭代通配符泛型?基本上我想内联以下方法:
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);
}
...
}
...
我的问题很简单:有没有办法放置一些可以迭代的通配符类型,或者这是泛型的限制(意味着不可能这样做)?
【问题讨论】:
-
如果您要内联该方法,您可能确实知道
factManager的类型。目前该变量是如何声明的? -
if one tries to inline this method是什么意思。它几乎已经内联了。 -
您可以使用反射,但不会出现编译错误,而是会出现运行时错误。最后但并非最不重要的一点是,您的所有代码都需要 try catch 保护
-
为什么
FactManager外部的东西将它用作Iterable并循环通过它包含的Facts,然后让相同的FactManager对它们做些什么?封装那个!FactManager会知道它有什么样的Facts。 -
@Colin:也许还有一些过滤正在进行,或者外部事物必须决定必须调用 FactManager 的哪个方法?