Java 由超级通配符引起的编译错误
我对下面的代码有疑问 您能告诉我为什么编译器拒绝接受ty.add(newa());?毕竟,A是B的超类(即,对应于需求) 错误消息如下所示: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
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。谢谢。事实上,矛盾是非常合适的词。谢谢。事实上,矛盾是非常合适的词。