java语言

初步理解Java的泛型特性分享

时间:2024-10-09 10:10:17 java语言 我要投稿
  • 相关推荐

初步理解Java的泛型特性分享

  初步理解Java的泛型特性

  在Java SE1.5中,增加了一个新的特性:泛型(日本语中的总称型)。何谓泛型呢?通俗的说,就是泛泛的指定对象所操作的类型,而不像常规方式一样使用某种固定的类型去指定。泛型的本质就是将所操作的数据类型参数化,也就是说,该数据类型被指定为一个参数。这种参数类型可以使用在类、接口以及方法定义中。

  一、为什么使用泛型呢?

  在以往的J2SE中,没有泛型的情况下,通常是使用Object类型来进行多种类型数据的操作。这个时候操作最多的就是针对该Object进行数据的强制转换,而这种转换是基于开发者对该数据类型明确的情况下进行的(比如将Object型转换为String型)。倘若类型不一致,编译器在编译过程中不会报错,但在运行时会出错。

  使用泛型的好处在于,它在编译的时候进行类型安全检查,并且在运行时所有的转换都是强制的,隐式的,大大提高了代码的重用率。

  二、定义&使用

  类型参数的命名风格为:

  推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。最好避免小写字母,这使它和其他的普通

  的形式参数很容易被区分开来。

  使用T代表类型,无论何时都没有比这更具体的类型来区分它。这经常见于泛型方法。如果有多个类型参数,我们

  可能使用字母表中T的临近的字母,比如S。

  如果一个泛型函数在一个泛型类里面出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字来避免混

  淆。对内部类也是同样。

  1.定义带类型参数的类

  在定义带类型参数的类时,在紧跟类命之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取

  值范围进行限定,多个类型参数之间用,号分隔。

  定义完类型参数后,可以在定义位置之后的类的几乎任意地方(静态块,静态属性,静态方法除外)使用类型参数,

  就像使用普通的类型一样。

  注意,父类定义的类型参数不能被子类继承。

  public class TestClassDefine{ .... }

  2.定义待类型参数方法

  在定义带类型参数的方法时,在紧跟可见范围修饰(例如public)之后的<>内,指定一个或多个类型参数的名字,

  同时也可以对类型参数的取值范围进行限定,多个类型参数之间用,号分隔。

  定义完类型参数后,可以在定义位置之后的方法的任意地方使用类型参数,就像使用普通的类型一样。

  例如:

  publicT testGenericMethodDefine(T t, S s){ ... }

  注意:定义带类型参数的方法,骑主要目的是为了表达多个参数以及返回值之间的关系。例如本例子中T和S的继

  承关系, 返回值的类型和第一个类型参数的值相同。

  如果仅仅是想实现多态,请优先使用通配符解决。通配符的内容见下面章节。

  publicvoid testGenericMethodDefine2(Lists){ ... }

  应改为

  public void testGenericMethodDefine2(List<?> s){ ... }

  3. 类型参数赋值

  当对类或方法的类型参数进行赋值时,要求对所有的类型参数进行赋值。否则,将得到一个编译错误。

  4.对带类型参数的类进行类型参数赋值

  对带类型参数的类进行类型参数赋值有两种方式

  第一声明类变量或者实例化时。例如

  Listlist; list = new ArrayList;

  第二继承类或者实现接口时。例如

  public class MyListextends ArrayListimplements List{...}

  5.对带类型参数方法进行赋值

  当调用范型方法时,编译器自动对类型参数进行赋值,当不能成功赋值时报编译错误。例如

  publicT testGenericMethodDefine3(T t, Listlist){ ... } publicT testGenericMethodDefine4(Listlist1, Listlist2){ ... } Number n = null; Integer i = null; Object o = null; testGenericMethodDefine(n, i);//此时T为Number, S为Integer testGenericMethodDefine(o, i);//T为Object, S为Integer Listlist1 = null; testGenericMethodDefine3(i, list1)//此时T为Number Listlist2 = null; testGenericMethodDefine4(list1, list2)//编译报错

  6.通配符

  在上面两小节中,对是类型参数赋予具体的值,除此,还可以对类型参数赋予不确定值。例如

  List unknownNumberList; List unknownBaseLineIntgerList; unknownList2 = listString; unknownList = unknownList2; listString = unknownList;//编译错误 sc = new SampleClass();

  只需要声明一个sc变量,很方便把!

【初步理解Java的泛型特性分享】相关文章:

java泛型方法03-27

Java技术三大特性03-29

java布尔型介绍04-03

java学习路线分享12-02

深入理解java的反射04-02

理解Java访问权限的控制04-02

理解java和python类变量04-02

理解java中的关键字04-02

浅谈理解Java中的弱引用04-02