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

捕获?扩展基页与泛型不匹配

司马飞鸿
2023-03-14

我尝试通过以下方式为我的PageFactory创建存储:

    private static Map<Class<? extends BasePage>, ? extends BasePage> pageStore = new HashMap<>();
    
    @SneakyThrows
    public <T extends BasePage> T getPage(Class<T> pageClazz) {
        T t = pageClazz.getDeclaredConstructor().newInstance();
        pageStore.put(pageClazz, t);//   <----   here is compilation error
        return null;
    }

因此,从代码部分您可以理解编译错误在哪里,尽管两者都是和从基本页扩展的T:

Required type: capture of ? extends BasePage do not math to the generic
Provided: T

我必须从更改类型吗


共有2个答案

颛孙晗昱
2023-03-14

您可以将页面存储更改为在值中使用基页,并使用继承关系将其添加到映射中,因为任何划分的类都将具有基页父级

private static Map<Class<? extends BasePage>, BasePage> pageStore = new HashMap<>();

public <T extends BasePage> T getPage(Class<T> pageClazz) throws Exception {
    T t = pageClazz.getDeclaredConstructor().newInstance();
    pageStore.put(pageClazz, t);
    return t;
}
牧璞
2023-03-14

这是因为您很可能对通配符在泛型中的含义有一个共同的误解Java。

类型<代码>?为地图的值扩展BasePage并不意味着可以将扩展BasePage的不同类型的对象作为值放置在此地图中。

这意味着:该映射中的值类型是一种特定的、但未知的类型,扩展了基本页。

您不能将任何值放入这样的映射中,因为这些值应该具有的类型未知。当您尝试在这样的映射中放入值时,编译器没有足够的信息来检查您添加的值是否具有正确的类型,因为编译器不知道特定类型是什么 表示。

这与为什么不能向列表中添加任何内容完全相同

如果您需要存储不同类型的对象,这些对象都是BasePage的子类型,那么正确的解决方案确实是使用BasePage而不是?扩展BasePage用于映射值的类型。

 类似资料:
  • 在这个问题中,我看到我可以使用帮助方法将通配符泛型“捕获”到类型T中以执行类型安全操作,如下所示: 但是当我尝试使用关键字执行此操作时,它不起作用: 我得到以下错误: 当使用扩展关键字时,有没有办法捕获通配符? 我的背景是,我有一个扩展给定类a的类列表,每个类都有一个不同的泛型参数T。对于每个类,我想获得对其T类的引用,我试图安全地进行类型转换。

  • 问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在

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

  • add和remove last方法都给出了编译时错误。请帮我弄明白我在这里做错了什么?

  • 问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地

  • 问题内容: 我不明白为什么要编译。我以为它检查了但没有检查? 问题答案: 泛型中的关键字在语义上与常规关键字略有不同。 当使用在泛型的上下文中,例如,这意味着,应该是一个类型的 任一 实现的接口(在情况下,当是接口), 或者 是子类(如果是一个类)。 可能的原因是,如果Generics中支持该关键字,则会使类型参数声明过于冗长。 例如,您将拥有: 相反,此方法的有效语法为: 实际上,您不需要关键字