时间:2021-05-19
一、泛型的基本概念
java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中的ArrayList<Integer>和ArrayList<String>是同一个类型,在编译时会执行类型擦除,及java中的类型是伪泛型,伪泛型将会在后面介绍,其次,对于像集合中添加基本类型的数据时,例如int,会首先将int转化成Integer对象,即我们通常所说的装箱操作,在取出元素的时候需要将Interger对象转换成int值类型,即拆箱操作。而在c#中,List<int>和List<string>是不同的类型,泛型参数在编译后会是一个占位符,并没有被擦除,在运行时被赋予正真的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀(针对类型膨胀,即时编译器已经做了很多的优化工作来解决这一问题),这就是所谓的真泛型。与此同时,在对集合中添加基本元素如int时,不需要装箱操作,取出元素时不需要拆箱操作,因此,性能上较java的集合泛型要好。
java中泛型的引入主要是为了解决两个方面的问题:1.集合类型元素在运行期出现类型装换异常,增加编译时类型的检查,2. 解决的时重复代码的编写,能够复用算法。下面通过例子来说明编译器的类型检查。
首先我们看一个没有使用泛型的例子:
我们可以向al集合中添加任何类型的数据。当我们在取出数据的时候需要时候类型转换,如:
String s = (String)al.get(0);String s1 = (String)al.get(1); //在运行期,会报错,类型转换错误Long l = (Long)al.get(2);由此可以看到,没有泛型的时候,减少了编译时的类型检查,在取出元素时需要程序员对每个元素的类型都了解,否则很可能在运行时出现类型转换的异常。
那么下面我们通过泛型集合来看看他给我们带来的好处。
ArrayList<String> al1 = new ArrayList<String>();al1.add("abc");al1.add(1); //编译时报错,当我们用String参数类型实例化al1后,我们是不能添加int元素的,否则编译器会报错,通常在IDE编辑器,如eclipse中会有错误标识,与此同时,在取出元素也不需要类型转换.
string value = al1.get(0); //不需要类型转换这便是泛型所带来的好处。
那么算法的复用主要是体现在,方法的复用,如ArrayList的Add方法可以使用在任何类型上或限定的类型上。
二、泛型的使用
java中的泛型主要使用在类,方法,与接口中。首先,我们来简单的看看在类上的使用:
class Factory<T>{ private T value; public T getValue() { return value; } public void setValue(T v) { this.value = v; } }添加测试方法:
Factory<String> f = new Factory<String>(); f.setValue("factory in use"); System.out.println(f.getValue());泛型接口的使用:
interface MyInterface<T,U>{ void show(T t, U u); } class ShowTest implements MyInterface<String,Integer>{ @Override public void show(String t, Integer u) { System.out.println(t); System.out.println(u); } }泛型类型参数作用于类上的时候主要是对多个字段及方法签名之间的类型约束。作用于方法的时候主要是对方法的的多个参数做相应的约束,在这里方法的泛型类型参数不再举例,下面我们主要介绍类型参数的约束。
三、类型参数约束
我们看一个小例子,如下代码所示:
public static <T> T get(T t1,T t2) { if(t1.compareTo(t2)>=0);//编译错误 ,the method compareTo(T) is undefined for the type T. return t1; }可以看到编译器报错的信息,对于类型T没有定义compareTo方法,在java中类型需要比较的话需要实现Comparable接口,从而重写该方法。 那么我们做如下修改:
public static <T extends Comparable> T get(T t1,T t2) { //添加类型限定 if(t1.compareTo(t2)>=0); return t1; }通过限定T extends Comparable 表明,T是实现了Comparable的接口的类型,因此也实现了compareTo方法,因此不会产生编译期错误。
类型的多个限定时我们可以使用&来进行分割,并且限定的关键词只能使用extends。与此同时在接口与类型都存在的情况下,类只能放在第一个,并且只能有一个,如下所示:
<T extends Object&Comparable&Serializable>以上这篇浅谈java泛型的作用及其基本概念就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
泛型是Java开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码。本文总结了Java泛型的三种形式以及泛型实现原理。泛型泛型的本质
Numpy是什么在没给大家介绍numpy之前先给大家说下python的基本概念。Python是一种高级的,动态的,多泛型的编程语言。Python代码很多时候看起
泛型是一个很有意思也很重要的概念,本篇将简单介绍Java中的泛型特性,主要从以下角度讲解: 1.什么是泛型。 2.如何使用泛型。 3.泛型的好处。1.
Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来核心代码:ArrayListff=newArrayL
简介前两篇文章介绍了泛型的基本用法、类型擦除以及泛型数组。在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。这个系列的另外两篇文章:Java泛型总