Java泛型详解,java的泛型

  Java泛型详解,java的泛型

  00-1010 1.一般概念2。泛型用法2.1泛型类语法2.2泛型方法语法2.3泛型接口语法2.4 main方法中的泛型用法3。擦除机制4。类属5的上界。通配符上限5.1通配符5.2通配符下限6。包装类别6.1包装和拆包

  00-1010泛型是类型的参数化。

  所谓类型参数化,就是定义一个类型作为参数,然后在使用这个类型的时候传入一个特定的类型。

  至此,我们可以看到泛型在定义时并不知道具体的类型,使用时需要传入。泛型可以用在类、接口和方法中。这样做的好处是,泛型可以应用于许多情况。

  

目录

 

  

1.泛型概念

公共类名T {.}

 

  T表示这是泛型类,T是type的大写字母。其他名称包括:

  元素

  凯西:钥匙

  伏:伏劳埃

  n:数字

  中可以有多种类型的参数,用逗号分隔。

  

2.泛型的使用

公共泛型类型返回值方法名(泛型类型参数){.}

 

  

2.1泛型类语法

公共接口接口名称通用类型{.}

 

  00-1010在下面写一个泛型类,引出下面的内容。

  FcT类{私人T a;public T get(T data){ this . a=data;返回a;}}如前所述,先使用泛型,然后传入特定的类型,所以在实例化上述泛型类时应该指定类型。具体方式如下

  类名具体类型变量名=新类名具体类型();

  注意:

  没有必要在正确的符号中写具体的类型。编译器可以从上下文推断出只有类可以用这里的类型编写。所以如果是基本数据类型,就要写其对应的包装器类。除了int是整数,char包装类是字符,其余都是大写的。不能在Java中创建泛型数组。至于原因,要从Java中泛型的机制说起。

  

2.2泛型方法语法

Java对泛型的实现依赖于这种擦除机制,目前太复杂,只谈结果。

 

  Java编译器在编译时会去掉类型参数,而对于泛型类型,如果指定了上限,则用上限类型替换,如果没有指定上限,则用Object替换。

  因此,在编译时,泛型类型被Object替换,编译后的类文件不包含任何泛型信息,即泛型信息不会进入运行时阶段。

  但是Java数组需要运行时检查,类型擦除导致数组运行时类型检查失败,破坏了Java数组运行时类型检查的机制。

  00-1010所谓泛型的上限,就是约束传入的类型变量,指定哪些类型可以传入,哪些不可以。语法如下:

  类名类型参数扩展了类型边界{.}

  或者以上面的泛型类为例,现在改成下面的情况:

  FcE类扩展号{ private E a;public E get(E data){ this . a=data;返回a;}}那么Fc此时只能传入Number或者它的子类

  00-1010通配符是“?”用在泛型中,用来解决泛型不能协变的问题。什么是协变?

  假设有A和B两个类,A继承了B,那么泛型FcA也应该是FcB的子类,但是泛型不支持这样的父子关系。

  基于上述情况

  以需要使用通配符

  直接写两个类,A继承B

  

class B {}class A extends B {}

 

  

 

  现在把<B>改成<?>

  

 

  

 

  

5.1通配符的上界

通配符也可以指定界限,语法和泛型的上界类似

 

  

<? extends 类型边界>

 

  

假设<? extends Number>,那么可以传入的是Number及其子类

 

  但需要注意的是:通配符的上界只能用来读取数据,不能用来写入数据

  因为我们只知道里面可以传入什么类型的数据,但具体是什么类型我们不知道,所以也就无法对数据进行修改,但是读取则可以直接用父类对象来进行接收读取出来的数据

  

 

  

5.2通配符的下界

下界使用的是super

 

  

<? super 类型边界>

 

  

<? super Integer>表示可以传入Integer或者其父类

 

  通配符下界可以进行写入数据,但不能用来读取数据

  原因也很简单,里面可以传的类都是Integer或者它的父类,写进去的数据可以进行转化,但读取数据用哪一个父类对象接收则不好确定了

  

 

  

6.包装类

由于Java中基本数据类型不是继承Object类,所以为了泛型能够支持基本数据类型,每一个基本数据类型都有各自的包装类

 

  基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean

 

  

6.1装箱和拆箱

装箱就是把基本数据类型改为对应的包装类类型,拆箱就是和装箱相反的操作

 

  Java中提供了自动装箱和拆箱机制,但还是先来看下手动装箱和拆箱的操作

  

//手动装箱int i=10;Integer j=Integer.valueOf(i); //第一种操作Integer j=new Integer(i); //第二种操作//手动拆箱int a=j.intValue();

自动装箱和拆箱的话代码就要少的多

 

  

int i=10;Integer j=i; //自动装箱int a=j; //自动拆箱

关于int的包装类有一个比较有趣的地方,装箱使用了valueOf方法,其源码如下:

 

  

 

  可以看到传给方法的参数首先是和IntegerCache进行比较,如果参数的值是在某个范围中,那么返回的是数组里面的元素,否则返回新的对象

  那我们来看看这个IntegerCache

  

 

  也就是说-128<=i<=127的时候返回的是类中的数组的元素,那么就会有一个情况如下:

  

 

  原因和上面所讲一样

  泛型结束,后面数据结构的时间复杂度和空间复杂度这两个概念就不写了,下一篇直接到顺序表

  到此这篇关于Java详细分析讲解泛型的文章就介绍到这了,更多相关Java泛型内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: