关于泛型的问题

u014657378 2014-10-17 05:59:15
class A{
}

class B extends A{
}

请问List<? extends A>是所有List<A>的父类?那Collection<? extends A>和List<A>是什么关系?List<? extends A>中存放的元素是List<A>中元素的子类?
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Paul_ZJ 2014-10-20
  • 打赏
  • 举报
回复
引用 6 楼 u014657378 的回复:
[quote=引用 5 楼 hao_rh 的回复:] [quote=引用 4 楼 u014657378 的回复:] [quote=引用 2 楼 aaron78901 的回复:] 泛型只是给集合指定类型,里面的内容不会改变 集合是不存在继承关系 Colletion是接口,List和Set是两个子接口 亲懂了吗
谢谢你的回复。 看疯狂JAVA讲义有点疑问,他定义了一个抽象Shape类,Circle和Rectangle继承了Shape,书中有这样一句话: //它表示所有Shape泛型List的父类 List<? extends Shape> 我对这句理解有点问题,只有List这一个类,泛型只是规定了里面的存放元素的类型,? extends Shape表示Shpe的子类啊,只是?表示这个子类的类型未知,所以我认为List<? extends Shape>中中只能存放Shape的子类,是这样的吗?[/quote] 应该是你说的这样的。List中存放Shape的子类。[/quote] 今天在书上看到这样一个例子。 private List<String>[] playersCards = new List[PLAY_NUM]; 创建了一个装List<String>的数组,这个数组装的是List<String>元素,而每个List中的元素又是String的,但是为什么我写private List<String>[] playersCards = new List<String>[PLAY_NUM];就会报错呢?我参照数组的初始化规则,int[] a = new int[5];这样应该是可以的啊。[/quote] ArrayList 可以方便的实现列表操作, 但有时候需要建立一个ArrayList数组. 首先想到的是类似下面的方法: ArrayList<int>[] list = new ArrayList<int>()[N]; 但会出现错误. 改为ArrayList[] list = new ArrayList[N]; 会有警告. 这是因为Java没有范型数组,可以参考以下方法实现类似功能: ArrayList<ArrayList<Integer>> als = new ArrayList<ArrayList<Integer>> (); ArrayList<Integer> a1 = new ArrayList<Integer>(); ArrayList<Integer> a2 = new ArrayList<Integer>(); ArrayList<Integer> a3 = new ArrayList<Integer>(); ArrayList<Integer> a4 = new ArrayList<Integer>(); 然后 als.add(a1); als.add(a2); als.add(a3); als.add(a4);
u014657378 2014-10-20
  • 打赏
  • 举报
回复
引用 5 楼 hao_rh 的回复:
[quote=引用 4 楼 u014657378 的回复:] [quote=引用 2 楼 aaron78901 的回复:] 泛型只是给集合指定类型,里面的内容不会改变 集合是不存在继承关系 Colletion是接口,List和Set是两个子接口 亲懂了吗
谢谢你的回复。 看疯狂JAVA讲义有点疑问,他定义了一个抽象Shape类,Circle和Rectangle继承了Shape,书中有这样一句话: //它表示所有Shape泛型List的父类 List<? extends Shape> 我对这句理解有点问题,只有List这一个类,泛型只是规定了里面的存放元素的类型,? extends Shape表示Shpe的子类啊,只是?表示这个子类的类型未知,所以我认为List<? extends Shape>中中只能存放Shape的子类,是这样的吗?[/quote] 应该是你说的这样的。List中存放Shape的子类。[/quote] 今天在书上看到这样一个例子。 private List<String>[] playersCards = new List[PLAY_NUM]; 创建了一个装List<String>的数组,这个数组装的是List<String>元素,而每个List中的元素又是String的,但是为什么我写private List<String>[] playersCards = new List<String>[PLAY_NUM];就会报错呢?我参照数组的初始化规则,int[] a = new int[5];这样应该是可以的啊。
hao_rh 2014-10-19
  • 打赏
  • 举报
回复
引用 4 楼 u014657378 的回复:
[quote=引用 2 楼 aaron78901 的回复:] 泛型只是给集合指定类型,里面的内容不会改变 集合是不存在继承关系 Colletion是接口,List和Set是两个子接口 亲懂了吗
谢谢你的回复。 看疯狂JAVA讲义有点疑问,他定义了一个抽象Shape类,Circle和Rectangle继承了Shape,书中有这样一句话: //它表示所有Shape泛型List的父类 List<? extends Shape> 我对这句理解有点问题,只有List这一个类,泛型只是规定了里面的存放元素的类型,? extends Shape表示Shpe的子类啊,只是?表示这个子类的类型未知,所以我认为List<? extends Shape>中中只能存放Shape的子类,是这样的吗?[/quote] 应该是你说的这样的。List中存放Shape的子类。
u014657378 2014-10-19
  • 打赏
  • 举报
回复
引用 2 楼 aaron78901 的回复:
泛型只是给集合指定类型,里面的内容不会改变 集合是不存在继承关系 Colletion是接口,List和Set是两个子接口 亲懂了吗
谢谢你的回复。 看疯狂JAVA讲义有点疑问,他定义了一个抽象Shape类,Circle和Rectangle继承了Shape,书中有这样一句话: //它表示所有Shape泛型List的父类 List<? extends Shape> 我对这句理解有点问题,只有List这一个类,泛型只是规定了里面的存放元素的类型,? extends Shape表示Shpe的子类啊,只是?表示这个子类的类型未知,所以我认为List<? extends Shape>中中只能存放Shape的子类,是这样的吗?
u014657378 2014-10-19
  • 打赏
  • 举报
回复
引用 1 楼 humanity 的回复:
类只有一个,没有什么 List<A> 的父类,这个类就是 List,只是当使用了泛型时,编译器会帮我们验证放进来的对象是不是期望的类型,仅此而已。 List<A> a = ... 只是表示只有A及A的子类型的对象能添加进来,List <? extends A> 表示 A 的所有子类型对象都可以添加进来。 反正,它只是用来验证放进去的对象。没有其它用途。 我们用代码实践来验证,如图,你会发现泛型仅是”让我们少敲几下键盘“。
看疯狂JAVA讲义有点疑问,他定义了一个抽象Shape类,Circle和Rectangle继承了Shape,书中有这样一句话: //它表示所有Shape泛型List的父类 List<? extends Shape> 我对这句理解有点问题,只有List这一个类,泛型只是规定了里面的存放元素的类型,? extends Shape表示Shpe的子类啊,只是?表示这个子类的类型未知,所以我认为List<? extends Shape>中中只能存放Shape的子类,是这样的吗?
aaron78901 2014-10-18
  • 打赏
  • 举报
回复
泛型只是给集合指定类型,里面的内容不会改变 集合是不存在继承关系 Colletion是接口,List和Set是两个子接口 亲懂了吗
humanity 2014-10-18
  • 打赏
  • 举报
回复
类只有一个,没有什么 List<A> 的父类,这个类就是 List,只是当使用了泛型时,编译器会帮我们验证放进来的对象是不是期望的类型,仅此而已。

List<A> a = ... 只是表示只有A及A的子类型的对象能添加进来,List <? extends A> 表示 A 的所有子类型对象都可以添加进来。

反正,它只是用来验证放进去的对象。没有其它用途。

我们用代码实践来验证,如图,你会发现泛型仅是”让我们少敲几下键盘“。

62,621

社区成员

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

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