A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陆华山 黑马帝   /  2011-10-22 11:15  /  2368 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何理解泛型的下限限制  ?super E  

2 个回复

倒序浏览
宁超 黑马帝 2011-10-22 12:12:04
沙发
  1. package com.cn.fanxing;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. class Toy  
  6. {  
  7.   
  8. }  
  9.   
  10. class SubToy extends Toy  
  11. {  
  12.   
  13. }  
  14.   
  15. class SubToy2 extends Toy  
  16. {  
  17.   
  18. }  
  19. public class Generics  
  20. {  
  21.   
  22.     public static void main(String[] args) throws Exception  
  23.     {  
  24.         Toy toy = new Toy();  
  25.         SubToy subToy = new SubToy();  
  26.         SubToy subToy2 = new SubToy();  
  27.   
  28.         List<? extends Toy> list = new ArrayList<Toy>();// 表示所持有对象是Toy子类   
  29.         List<? extends Toy> list1 = new ArrayList<SubToy>();// 表示所持有对象是Toy的子类   
  30.   
  31.         // list.add(toy); 错误的 因为list所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,   
  32.         // list.add(subToy); 错误的,理由同上   
  33.         // list.add(subToy2); 错误的,理由同上   
  34.   
  35.         // list1.add(toy); 错误的 因为list1所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,   
  36.         // list1.add(subToy); 错误的,理由同上   
  37.         // list1.add(subToy2); 错误的,理由同上   
  38.   
  39.         List<? super Toy> list2 = new ArrayList<Toy>();// 所持有对象为Toy的超类,下限为Toy,所以可以add()   
  40.                                                         // Toy及Toy的子类   
  41.         list2.add(toy);  
  42.         list2.add(subToy);  
  43.         list2.add(subToy2);  
  44.   
  45.         // List<? super Toy> list3 = new ArrayList<SubToy>();   
  46.         // 错误的,所持有对象为Toy的超类,下限为Toy,   
  47.         // 所以不可以超过下限Toy,将ArrayList泛型指定为SubToy   
  48.   
  49.         List<? super SubToy> list4 = new ArrayList<Toy>();// 所持有对象为SubToy的超类,下限为SubToy   
  50.                                                             // ,   
  51.                                                             // 可以将ArrayList泛型指定为Toy   
  52.                                                             // list4.add(toy);   
  53.                                                             // 错误的,因为虽然持有对象为SubToy的超类,但是容器不知道具体的类型是超类还是子类,所以不能放入超类,但是子类的话就可以的   
  54.         list4.add(subToy);  
  55.         list4.add(subToy2);  
  56.   
  57.         List<? super SubToy> list5 = new ArrayList<SubToy>();// 所持有对象为SubToy的超类,下限为SubToy   
  58.                                                                 // ,   
  59.         // 可以将ArrayList泛型指定为SubToy   
  60.         // list5.add(toy); 错误的,理由同list4   
  61.         list5.add(subToy);  
  62.         list5.add(subToy2);  
  63.   
  64.         // List<? super SubToy> list6 = new ArrayList<SubToy2>();   
  65.         // 错误的,所持有对象为SubToy的超类,下限为SubToy ,   
  66.         // 所以持有的对象可能为Toy,也可能为SubToy ,也就不能将具体的实现的泛型指定为SubToy2   
  67.   
  68.     }  
  69.   
  70. }
复制代码
回复 使用道具 举报
杨杰 黑马帝 2011-10-22 12:22:29
藤椅
跟着斑竹学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马