java - 为什么这段通用代码会出现编译错误

标签 java generics compiler-errors

有人可以解释一下为什么没有这一行吗? 12 给出编译时错误?

package com.soflow;

import java.util.List;

public abstract class Shape {
}

class Rectangle extends Shape {
    private int x, y, width, height;

    public void addRectangle(List<? extends Shape> shapes) {
        shapes.add(0, new Rectangle()); // compile-time error!
        }
}

我在这里无法理解的是,为什么它不允许我将形状的子类型添加到“形状”列表中?为什么它在编译时提示? 我相信编译器可以看到 Rectangle 和 Shape 之间存在 IS-A 关系。我现在很困惑。 非常感谢任何帮助。

谢谢, 马尼什·夏尔马

任何帮助将不胜感激

最佳答案

List<? extends Shape>表示用Shape任何子类参数化的列表,不是接受形状的任何子类作为其内容的列表。那只是 List<Shape> .

想象一下shapesList<Triangle>在运行时。这显然是一个错误,因为您无法将矩形添加到 List<Triangle> .

但是,让我们考虑一下为什么 List<Rectangle> , List<Shape>List<? super Shape>这里是正确的。在第一种情况下,很明显:A List<Rectangle>会接受 Rectangle 的实例。第二个,因为所有 Rectangle实例可分配给Shape ,它们可以放入 List<Shape> 。在第三种情况下,绑定(bind)保证列表将接受 Shape通过成为 Shape 的父类(super class)。

记住下面这句话:“生产者扩展,消费者 super ”。这里的列表是添加项目的消费者,因此它需要是 super .

关于java - 为什么这段通用代码会出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109399/

相关文章:

java - EJB 实体 : database row is automatically updated from Entity without save in EJB

java - 如何为 Spring Boot 项目设置 Google Cloud Compute Engine?

java - 如何区分 get 和 post call..?

java - 如何与谷歌日历集成?

generics - "no field on type"泛型类型实现错误

c# - 如何向上转换泛型类型参数

java - 使用java泛型添加2种类型的参数

compiler-errors - 在Debian 8.6上安装CouchDB 2.0.0失败

c++编译错误在调试但不是在发布

c# - (潜在的Visual Studio错误)Visual Studio 2019错误列表显示了不应该存在的错误,因为该错误实际上不存在