泛型的上下边界 : ? extends E 与 ? super T
2024-08-29 16:32:56
public class Problem { public static void main(String[] args) { List<? extends A> list;
List<SonA> list2 = new ArrayList<SonA>();
list = list2;
list.add(new SonA() //error
list2.add(new SonA());
A a=list.get(); }
} class A extends FatherA { } class SonA extends A { } class FatherA { }
由代码可知,? extend A表示list集合里面装的都是A的子类,因此arraylist中的对象只能存放A的子类,但是list.add(new SonA())编译时不可通过的.因为list中只是指定了一个范围,并没有特定一个类,所以不能使用add方法对list进行集合的add,会出现转换的错误。然而能使用get方法,因为集合中的类型都可以用父类A 来表示
public static void main(String[] args) { List<? super A> list = new ArrayList<FatherA>();
// List<? super A> list=new ArrayList<SonA>(); error List<FatherA> list2 = new ArrayList<FatherA>();
list2.add(new FatherA());
list.add(new SonA());
// list.add(new FatherA()); error
Object o = list.get(0);
FatherA a = (FatherA) o; }
}
这就是 ?suepr A ,list集合中存放的是A的父类 所以能指向FatherA的arraylist,那为什么这里能使用add呢,因为list中都是A或A的父类,如果把A的子类添加进去是不影响的,因为这些子类都能用A或者A的父类来表示,能进行上转型。但是添加A的父类就不行了,因为互相之间不知道有什么联系,会出现类型错误。get的时候只能用超类Object表示,但是能进行向下转型。
其实,一个集合中只能用一个类型来表示,只要互相之间能转换就行。
最新文章
- [LeetCode] Count and Say 计数和读法
- [leetcode]leetcode初体验
- URL编码 utf-8 gb2312的区别
- c#接口容易被忽视的问题
- tfs 任务自定义项
- hdu 5752 Sqrt Bo
- Amoeba:开源的分布式数据库Porxy解决方案
- C语言运算符优先级表
- ASP.NET Web API Authorization using Tokens
- SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column &#39;dtdate&#39; 解决方法
- PHP 下载远程图片
- [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds...
- SSH实现无密码验证登录
- 孤儿文档是怎样产生的(MongoDB orphaned document)
- vue-cli3.0 使用postcss-plugin-px2rem(推荐)和 postcss-pxtorem(postcss-px2rem)自动转换px为rem 的配置方法;
- JavaScript eval
- 【2016.4.6】结对编程 终章 THE END
- golang xml parent node add attribute without struct
- zookeeper 图形化的客户端工具:ZooInspector
- 大数据领域两大最主流集群管理工具Ambari和Cloudera Manger
热门文章
- 网站搭建 (第06天) Ckeditor编辑器
- Tag
- windows服务安装,卸载
- vim编辑器-多行加注释与去注释
- IT - 偶像的力量
- ubuntu安装QGIS
- LeetCode--028--实现strStr() (java)
- java 获取微信公众号code为空
- Matlab - 各种函数学习
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter &#39;XXX&#39; not found. Available parameters are [arg1, arg0, param1, param2]