Java 由超级通配符引起的编译错误

Java 由超级通配符引起的编译错误,java,generics,arraylist,wildcard,super,Java,Generics,Arraylist,Wildcard,Super,我对下面的代码有疑问 您能告诉我为什么编译器拒绝接受ty.add(newa());?毕竟,A是B的超类(即,对应于需求) 错误消息如下所示: C.java:15: error: no suitable method found for add(A) ty.add(new A()); ^ method List.add(int,CAP#1) is not applicable (actual and forma

我对下面的代码有疑问

您能告诉我为什么编译器拒绝接受ty.add(newa());?毕竟,A是B的超类(即,对应于需求)

错误消息如下所示:

C.java:15: error: no suitable method found for add(A)
                ty.add(new A());
                  ^
    method List.add(int,CAP#1) is not applicable
      (actual and formal argument lists differ in length)
    method List.add(CAP#1) is not applicable
      (actual argument A cannot be converted to CAP#1 by method invocation conversion)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object super: B from capture of ? super B
1 error
下面是代码(C.java):

import java.util.ArrayList;
导入java.util.List;
甲级
{
}
B类扩展了A类
{
}
C类扩展到B类
{
公共静态void main(字符串参数[])
{

列出你误解了
?super B
的意思。它意味着它是一个在编译时未知的类,即
B
B
的超类。编译器只知道可以添加
B
对象,毕竟它可以是
数组列表
。因此它必须禁止添加
a


<> >为了允许添加<代码> <代码> >考虑<代码>列表> p>您误解了<代码>超级b>代码>。这意味着它是一个类,在编译时未知,即<代码> b>代码>或“代码> b>代码>的超类。编译器只知道<代码> b>代码>对象可以被添加,毕竟,它可以是<代码> ARARYLIST/<代码>。它必须禁止添加
A


<> >如果允许添加<代码> ,请考虑<代码>列表> P>,如果您只想添加子类对象,则只需将列表声明为:

List<A> list = new ArrayList<A>();
list.add(new A());  // fine
list.add(new B());  // fine
列表

  • 如果您只想添加子类对象,那么只需将列表声明为:

    List<A> list = new ArrayList<A>();
    list.add(new A());  // fine
    list.add(new B());  // fine
    
    列表
    

    • ?在这种情况下,是一个存在量词,而不是一个通用的量词。
      列表
      对于一些未知的T应该被理解为
      ,例如B
      。这意味着你只能添加
      B
      实例,或者,矛盾的是,
      B
      的任何子类,比如
      C
      实例。

      在这种情况下,是一个存在量词ntifier,不是通用的。
      列表<?super B>
      应该被理解为
      一些未知的T,例如B
      。这意味着你只能添加
      B
      实例,或者,矛盾的是,添加
      B
      的任何子类,比如
      C
      实例。

      谢谢你的回答。是的,在这种情况下我真的误解了super。谢谢r你的答案。是的,在这个例子中我真的误解了super。谢谢。事实上,矛盾是非常合适的词。谢谢。事实上,矛盾是非常合适的词。