如何迭代通配符泛型?

2023-11-27

如何迭代通配符泛型?基本上我想内联以下方法:

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(使用前将#替换为@)

如何迭代通配符泛型? 的相关文章

随机推荐