求助:关于Java泛型通配符

learner-l 2014-02-17 09:56:57
和各位请教一个关于泛型通配符的问题,以下是程序:
import java.util.*;
import java.io.*;

class A
{
int a;
public A()
{
a=5;
}
}

class B extends A implements Serializable
{
int b;
public B()
{
super();
b=15;
}
}

public class Test
{
public static void main(String[] args)
{
ArrayList<A> list1=new ArrayList<A>();
ArrayList<? super B> list2=list1;
list2.add(new A());
list2.add(new B());
}
}

上述程序中,语句"list2.add(new A());"出错,编译器提示:
The method add(capture#1-of ? super B) in the type ArrayList<capture#1-of ? super B> is not applicable for the arguments (A)
这其中的原因是什么,请高人指点迷津,非常感谢!
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
learner-l 2014-02-18
  • 打赏
  • 举报
回复
引用 5 楼 raistlic 的回复:
多说一句, <? super B> 表示“B的某种父类型”, 同理,在无法确定“某种”究竟是“哪种”的情况下, 可以确定是<? super B>的“父类型”的只有Object, 所以当你调用 list2 的 get(int) 方法的时候,返回值只能用 Object 来接
非常感谢raistlic的详细解答。
raistlic 2014-02-18
  • 打赏
  • 举报
回复
多说一句, <? super B> 表示“B的某种父类型”, 同理,在无法确定“某种”究竟是“哪种”的情况下, 可以确定是<? super B>的“父类型”的只有Object, 所以当你调用 list2 的 get(int) 方法的时候,返回值只能用 Object 来接
raistlic 2014-02-18
  • 打赏
  • 举报
回复
引用 3 楼 u013681151 的回复:
B是A的子类,所以ArrayList<A>是ArrayList<? super B>的子类
ArrayList<A>和ArrayList<? super B>之间没有继承关系, ArrayList<? super B> list=new ArrayList<A>(); 编译通过是因为泛型的语法就是这样支持的, <? super B> 表示“B的某种父类型”, 在无法确定“某种”究竟是“哪种”的情况下, 可以确定是<? super B>的“子类型”的只有 B 和 B的子类型 (“子类型”加引号,准确的说法是“符合条件的类型”)
learner-l 2014-02-18
  • 打赏
  • 举报
回复
引用 2 楼 raistlic 的回复:
<? super B> 表示其方法参数可以接受 B 或 B 的子类型
依据替换原则(substitution principle),父类引用变量可指向子类对象。 B是A的子类,所以ArrayList<A>是ArrayList<? super B>的子类,并且"ArrayList<? super B> list=new ArrayList<A>();"编译通过。 对于方法add(? super B),请问什么才是类型"? super B"的子类。 小弟是泛型初学者,还请多多指教。谢谢!
raistlic 2014-02-18
  • 打赏
  • 举报
回复
<? super B> 表示其方法参数可以接受 B 或 B 的子类型

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧