知识大全 泛型类型的子类及通配符的使用
Posted 类型
篇首语:天行健,君子以自强不息。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 泛型类型的子类及通配符的使用相关的知识,希望对你有一定的参考价值。
本文讲述以下几个方面的内容 试图说明泛型类型的子类及通配符的使用
( ) 子类及替换原则
( ) 使用extends关键字的通配符
( ) 使用super关键字的通配符
( ) 子类及替换原则
在java语言中 我们通俗讲一个类是另一个类的子类型 是通过使用extends关键字去继承某一个类或者使用implements关键字去实现某些接口 这样我们在编程时就可以面向接口或基类进行编程 如
Number num = new Integer( )
Number num = new Double( d)
这个就是所谓的替换原则 替换原则的定义是
Substitution Principle a variable of a given type may be assigned a value of any subtype of that type and a method with a parameter of a given type may be invoked with an argument of any subtype of that type
大概的意思是说某种类型的变量可以被该类型的任何子类所赋值 一个方法中的参数也可以被该参数的任何子类进行调用
现在我们再来看看泛型中替换原则的适用性
Example
List<Number> listNums = new ArrayList<Number>()
nums add( )
nums add( )
在example 中 可以看出替换原则被很好地应用在这里 ArrayList是List的子类 我们提供给listNums变量的类型参数为Number 往 listNums中添加元素时 被封箱为Integer类型 而Integer是Number的子类 第三行的情况类似
Example
List<Integer> intList = new ArrayList<Integer>()
List<Number> numList = intList //pile error
…
numList add( ) // can t do that
根据替换原则 我们会很容易想到 既然Integer是Number的子类 则我们应该可以将List<Integer>的变量赋给 List<Number>的变量 但从实际情况表明 List<Integer>并不是List<Number>的子类
我们不妨试想想 若果List<Integer>类型的变量可以成功赋值给List<Number>类型的变量 会出现什么情况?我们可能在程序的某个位置添加一个double类型的元素进去numList中 而实质上在numList中其它元素都是Integer 的类型的元素 这样就违背了泛型的初衷了
有时 我们确实希望将形如List<Integer>的List对象赋给List<Number>的变量 这时就要使用extends关键字的通配符
( ) 使用extends关键字的通配符
Example
List<Integer> intList = new ArrayList<Integer>()
List<? extends Number> numList = intList()
…
numList add( ) //pile error (can t do that)
从Example 看到numList这个变量 我们可以将类型参数为Number及其Number子类的List赋给它
记住一条规则如果你使用了 ? extends T 一般情况下 你不能往该数据结构中put元素 而你可以做的就是get元素
如果要往内put元素 就需要使用下面提到的super关键字的通配符
( ) 使用super关键字的通配符
Example
List<Integer> intList = new ArrayList<Integer()
List<? super Integer> numList = intList
numList add( ) //can put integer or null
在example 我们可以看到<? super Integer>的意思为 我们可以将类型参数为Integer或Integer超类的List赋给 numList变量 并且可以put元素到列表中(注意 在该例子中put进的元素只能为Integer或null类型)
cha138/Article/program/Java/hx/201311/26223相关参考
Java高级编程——泛型类型第一部分 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 编辑按《Ja
.NET泛型方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 泛型方法 泛型方法是使用类型参
JDK令我们期待很久可是当他发布的时候却更换版本号为这说明Java已经有大幅度的变化本文将讲解JDK支持的新功能Java的泛型 Java泛型 其实Java的泛型就是创建一个用类型作为参数的类就
关于如何换肤子类化的解决方案 对于应用程序的换肤及子类化下面是我尝试过一些
Action通配符(wildcard)的配置 使用通配符将配置量降到最低不过一定要遵守约定优于配置的原则 通配符 星号(*) 表示所有 数字 表示第几个通配符 例如
Oracle通配符,运算符的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! oracle通配
Struts2通配符映射 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!struts的关于metho
注释 oracle使用的是–(两个)批量注释/**/ mysql使用的是#批量注释/**/ 通配符的使用 mysql和oracle都支持通配符%用以模糊查询mysql还可以用instr(p
电子类学生英文自我介绍Goodmorning!Itisreallymyhonortohavethisopportunityforainterview,Ihopeicanmakeagoodperform
JavaThread类如何在子类中实现run 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ja