Java 上限通配符(扩展)不起作用;ArrayList<;?扩展超类型>;不';不允许子类型的实例

Java 上限通配符(扩展)不起作用;ArrayList<;?扩展超类型>;不';不允许子类型的实例,java,generics,compiler-errors,bounded-wildcard,Java,Generics,Compiler Errors,Bounded Wildcard,据我所知,有界通配符是一个类型参数,如果要添加到泛型列表中,应该使用super扩展用于读取(get和etc)操作。您可以在Joshua Bloch的《有效Java》中找到详细信息,第28项:使用有界通配符提高API灵活性对于这种情况,请使用ArrayList并让duck类型处理它。这不是一个bug,但我不能很好地解释为什么它不工作。泛型需要您指定一个类型才能对instance@Felk我不是在寻找答案,而是在为未来的记录寻找解释。我过去使用过上界通配符,从未遇到过这个问题。教程甚至说它是@Vin

据我所知,有界通配符是一个类型参数
,如果要添加到泛型列表中,应该使用
super
<代码>扩展
用于读取(get和etc)操作。您可以在Joshua Bloch的《有效Java》中找到详细信息,第28项:使用有界通配符提高API灵活性

对于这种情况,请使用
ArrayList
并让duck类型处理它。这不是一个bug,但我不能很好地解释为什么它不工作。泛型需要您指定一个类型才能对instance@Felk我不是在寻找答案,而是在为未来的记录寻找解释。我过去使用过上界通配符,从未遇到过这个问题。教程甚至说它是
@VinceEmigh<代码>列表我认为这更像是一种最佳实践(如:如何编写更好的API),但它并没有真正回答这个问题。不,我手边没有这本书。你能详细说明什么是读操作吗?声明的类型如何在
get
操作中发挥作用?我在文章中提到:如果参数化类型表示T生产者,请使用
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<? extends Position> list = new ArrayList<>();
        list.add(new GridPosition()); // Error on this line
    }
}

class Position {}
class GridPosition extends Position {}
class Super {}
class Position extends Super {}
class GridPosition extends Position {}