当前位置: 首页 > 面试题库 >

为什么泛型类型不适用于自变量扩展两者的超类?

仲孙磊
2023-03-14
问题内容

这是我一直试图找到解决方案的问题。

我们有两个类定义。两个之一扩展另一个。

    class T{}
    class TT extends T{}

要求是应该有一个列表来保持对象扩展T

    List<? extends T> list = new ArrayList<>();

但是,当我尝试将TT对象(似乎不是T的子类)放入列表时,就会出现问题。

    list.add(new TT());

编译错误信息

类型List中的方法add(capture#2-of?extended Cell)不适用于参数(Cell)


问题答案:

您可以List<T> list = new ArrayList<T>();直接创建一个,这可以允许T的所有子类型进入列表。这实际上很难理解。当您声明为

List<? extends T> list = ...

这意味着它可以允许T列表的任何未知子类型。但是,根据该声明,我们无法确保确切的子类型T。因此,我们只能添加null到其中



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

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

  • Java说: 所以说数组是协变的。但对于泛型,他们说: 因此它是不变量。但问题是,“泛型真的不变吗?”? 例如,如果我给出: 这意味着列表可以采用异常的子类型,例如这是有效的: 那么为什么泛型被称为不变量呢?

  • 我不熟悉泛型,并且深入研究了一些基本上超出我知识范围的东西,所以请耐心听我说。也许我问的问题很傻,但我似乎无法找到一个明确的答案来说明我希望做的事情是否可行,也许是因为我不知道要寻找的正确术语。 我有两个Java类,它们由一个T类型的实体参数化——一个存储库和一个服务。由于我的所有存储库和所有服务都将执行一些相同的基本任务,因此我的通用repo和服务已经实现了上述任务,并通过受保护的功能将它们提供

  • 问题内容: 是否可以为特殊/构造的泛型类型扩展泛型类?我想使用一种方法来扩展Int Arrays,以计算其元素的总和。 例如 问题答案: Swift 5.x:

  • 我想通过一个自定义的泛型unapply函数压缩我的计算器,该函数计算参数并在成功时返回值。 但是这失败了,错误 有什么方法可以实现这一点吗?我已经研究了类型标签,不适用方法的隐式转换,但我不知道如何将它们集成到这个问题中。如何正确定义Eval?