本篇文章给大家分享的是有关Java generic中通配符的理解有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联从2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元万安做网站,已为上家服务,为万安各地企业和个人服务,联系电话:13518219792
置换原则
结合Java本身的一些面向对象的特性,我们很容易理解这么一个置换原则:
一个指定类型的变量可以被赋值为该类型的任何子类;一个指定某种类型参数的方法可以通过传入该类型的子类来进行调用。
总的来说,就是说我们使用的任何类型变量都可以用该类型的子类型来替换。
泛型中一种错误的继承关系
在泛型的编程中,我们考虑到子类型关系的时候,容易把一种关系给弄混淆,并错误的采用置换原则。
比如说:
Listints = new ArrayList (); ints.add(1); ints.add(2); List nums = ints; // compile error
在这段代码中,我们看到类型参数Integer是Number的子类型,就容易想当然的认为List
有点时候,我们觉得,这样的转换看似不能用到一个好处,就是利用对象之间继承的关系。要是我们能有一个列表,它既能处理某种类型的数据,还能处理该类型的所有子类型的数据,这样岂不是既能用到泛型的好处又可以用到对象关系的好处么?于是在这里就引出了通配符(wildcard)。
通配符(Wildcard)
在Java类库中Collection接口定义中有一个用到通配符的方法:
interface Collection{ ... public boolean addAll(Collection extends E> c); ... }
在addAll方法的描述里,可以接受Collection类型的参数。其中Collection中的类型参数可以为任何继承E的子类型。
因此,我们可以在实际代码中这么使用:
Listnums = new ArrayList (); List ints = Arrays.asList(1, 2); List dbls = Arrays.asList(2.78, 3.14); nums.addAll(ints); nums.addAll(dbls);
在代码中我们可以看到,List
通配符使用限制1:
使用通配符的泛型数据类型比较有意思,既然前面我们可以将其作为方法声明的参数,那么是否可以将它作为一个变量类型来直接创建变量呢?
看如下代码:
List extends Number> nums = new ArrayList(); //compile error
实际上上面这段代码是编译通不过的。
通配符使用限制2:
既然不能用来直接创建变量对象,那么再看下面这段代码:
Listints = new ArrayList (); ints.add(1); ints.add(2); List extends Number> nums = ints; nums.add(3.14); // compile error
这段代码的第5行会导致编译错误。在第4行代码中,我们将ints赋值给nums,表面上nums声明为一个List
nums本来引用的是一个继承自该类型的List
因此,这段代码也说明了一个问题,就是在? extends E这种通配符引用的数据类型中,如果向其中增加数据操作的话会有问题。所以向其中增加数据是不允许的。但是我们可以从其中来读取数据。
总结:
1:通配符修饰的泛型不能用来直接创建变量对象。
2:通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递。这么做带来的好处就是我们可以将应用于包含某些数据类型的列表的方法也应用到包含其子类型的列表中。相当于可以在列表中用到一些面向对象的特性。
以上就是Java generic中通配符的理解有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。