知识大全 泛型类型的子类及通配符的使用

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高级编程——泛型类型 第一部分

Java高级编程——泛型类型第一部分  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  编辑按《Ja

知识大全 .NET 泛型方法

.NET泛型方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  泛型方法  泛型方法是使用类型参

知识大全 java泛型编程

  JDK令我们期待很久可是当他发布的时候却更换版本号为这说明Java已经有大幅度的变化本文将讲解JDK支持的新功能Java的泛型  Java泛型  其实Java的泛型就是创建一个用类型作为参数的类就

知识大全 关于如何换肤、子类化的解决方案

  关于如何换肤子类化的解决方案            对于应用程序的换肤及子类化下面是我尝试过一些

知识大全 struts2中的通配符

  Action通配符(wildcard)的配置  使用通配符将配置量降到最低不过一定要遵守约定优于配置的原则   通配符  星号(*) 表示所有  数字 表示第几个通配符  例如

知识大全 Oracle通配符,运算符的使用

Oracle通配符,运算符的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  oracle通配

知识大全 Struts2通配符映射

Struts2通配符映射  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!struts的关于metho

知识大全 mysql和oracle常用内容比较

  注释  oracle使用的是–(两个)批量注释/**/  mysql使用的是#批量注释/**/  通配符的使用  mysql和oracle都支持通配符%用以模糊查询mysql还可以用instr(p

知识大全 电子类学生英文自我介绍

电子类学生英文自我介绍Goodmorning!Itisreallymyhonortohavethisopportunityforainterview,Ihopeicanmakeagoodperform

知识大全 Java Thread类如何在子类中实现run

JavaThread类如何在子类中实现run  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Ja