当前位置: 首页 > 知识库问答 >
问题:

Java泛型使用扩展捕获通配符

欧阳向文
2023-03-14

在这个问题中,我看到我可以使用帮助方法将通配符泛型“捕获”到类型T中以执行类型安全操作,如下所示:

void foo(List<?> i) {
    fooHelper(i);
}

private <T> void fooHelper(List<T> l) {
    l.set(0, l.get(0));
}

但是当我尝试使用扩展关键字执行此操作时,它不起作用:

void bar() {
    barHelper(String.class); //works fine
}

void bar(Class<? extends Comparable<?>> clazz) {
    barHelper(clazz); //doesn't compile
}

<T> void barHelper(Class<? extends Comparable<T>> clazz) { }

我得到以下错误:

The method fooHelper
    (Class<? extends Comparable<T>>)
in the type Test is not applicable for the arguments
    (Class<capture#1-of ? extends Comparable<?>>)

当使用扩展关键字时,有没有办法捕获通配符?

我的背景是,我有一个扩展给定类a的类列表,每个类都有一个不同的泛型参数T。对于每个类,我想获得对其T类的引用,我试图安全地进行类型转换。

共有1个答案

蒯硕
2023-03-14

我认为泛型约束必须在类型参数<代码>

<T> void barHelper(Class<? extends Comparable<T>> clazz) { }

我会写信

<A, B extends A> void barHelper(Class<B> clazz) { }

或者如果知道超级/顶级

<T extends MySuperType> void barHelper(Class<T> clazz) { }
 类似资料:
  • 我尝试通过以下方式为我的PageFactory创建存储: 因此,从代码部分您可以理解编译错误在哪里,尽管两者都是和从基本页扩展的T: 我必须从

  • 问题内容: 阅读Java在线教程,我对通配符捕获一无所知。例如: 为什么编译器无法保留分配的安全性?它知道,例如,通过执行带有整数列表的方法,它可以从i.get中获取一个整数值。因此,它尝试将索引0处的Integer值设置为相同的Integer列表(i)。那么,怎么了?为什么要编写通配符助手? 问题答案: 为什么编译器无法保留分配的安全性? 编译器不知道 任何 关于类型中的元素通过定义。通配符并

  • 在阅读Java在线教程时,我对通配符捕获一无所知。例如:

  • 下面的SCCE显示了实现接口标记的两个类(B和C)。对于实现Marker的每个类,都有一个实现泛型处理程序接口的对应类(B_处理程序、C_处理程序)。映射用于关联Pair的类类型。其次是它的关联处理程序。代码按预期执行;但是,我得到一个编译时警告: 警告:[未检查]未检查的强制转换处理程序h1=(处理程序)(dispatch.get(p1.second.get类()));需要:处理程序找到:处理程

  • 我得到以下编译错误: 当我编译(在Eclipse Juno中使用JDK 1.7.0)以下代码时: null 这样我就可以测试我所有的排序实现并测试它们。我想将结果与Java的排序实现进行比较,所以我也在编写这个接口的实现,它在内部只调用Java的排序方法。这就是我面对问题的地方。

  • 问题内容: 我正在与一起工作,并且在更换单元格工厂时需要通过一个 我所在的班级是A,但我不知道如何使用“捕获”? 我试图创造 但IDEA显示警告 我尝试使用特定的类(例如String)代替“?” 同样,但没有任何帮助。 谁能向我解释如何使用此方法? 谢谢。 编辑: 我收集了一点点信息。该的应该是,但是,TreeTableColumn是我与原始类型创建工作(在库)。 使用原始类型回叫有效。但是还有其