美国上市公司,专注Java培训21年

java泛型的作用与使用方法是什么?


泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。对于java中的泛型它的作用与使用方法你了解吗?

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。下面来具体讲解一下。

一、泛型的作用:

泛型提供的功能有:参数化类型,以及编译期类型检查。

1、参数化类型

在方法的定义中,方法的参数称为形参,在实际调用方法时传递实参。泛型的使用中,可以将类型定义为一个参数,在实际使用时再传递具体类型。将泛型这种使用方式称之为参数化类型。

在集合类的使用中,若不使用泛型,则需要对每一种元素类型设计相同的集合操作,例如:

class ListInteger{

//...

}

class ListDouble{

//...

}

通过泛型的使用,可以避免这种重复定义的现象,定义一套集合操作,来应对所有元素类型,例如:

class List<E>{

//...

}

在使用中传递不同的元素类型给List即可。

这里使用的字符E并无特殊含义,只是为了便于理解而已。泛型中通常使用的字符及表示意义为:

K: 键值对中的key

V: 键值对中的value

E: 集合中的element

T: 类的类型type

2、编译期类型检查

对于集合ArrayList而言,若不指定具体元素类型,则使用过程中可能出现以下情况:

List list = new ArrayList();

list.add("abc");

list.add(123);

for (Object obj : list) {

String e = (String) obj;//ClassCastException

}

这段代码在编译期没问题,运行时会报出java.lang.ClassCastException。

这种对集合的使用方式存在两个问题:一是add添加元素时,因为元素声明为Object类型,任意类型元素都可以添加到集合中,所以在添加元素时需要使用者自己注意选择的元素类型;二是get取元素时需要强制类型转换,需要开发人员记住操作的元素类型,否则可能抛出ClassCastException异常。

在声明集合时指定元素类型则可以避免以上两种问题:

List<String> list = new ArrayList<String>();

list.add("abc");

//list.add(123); compile error

for (String obj : list) {

String e = obj;

}

通过泛型的使用,指定集合元素的类型,则可以在编译期就进行元素类型检查,并且get获取元素时无需进行强制类型转换。

这里称获取元素无需进行强制类型转换,其实并不准确,严格来讲,使用泛型在进行获取元素操作时,进行的是隐式类型转换,所以仍然存在强制类型转换的操作。

ArrayList中的隐式类型转换:

public E get(int index) {

rangeCheck(index);

return elementData(index);

}

E elementData(int index) {

return (E) elementData[index];

}

二、泛型的使用

泛型可以应用于定义泛型类、泛型接口和泛型方法。

1、泛型类

泛型类的定义方式较为简单,通过将类型抽象为参数,附加在类名称后,即可完成泛型类的定义,示例:

public class Test {

public static void main(String[] args) {

User<Integer> user = new User<>();

user.setAttribute(123);

// user.setAttribute("abc");compile error

Integer attribute = user.getAttribute();

}

}

class User<T> {

private T attribute;

public User() {

}

public T getAttribute() {

return this.attribute;

}

public void setAttribute(T attribute) {

this.attribute = attribute;

}

}

通过使用泛型类,可以在编译期进行参数类型检查,并且使用时无需进行强制类型转换。

2、泛型接口

泛型接口的使用与泛型类较为相似,在接口名称后添加表示类型的字符即可,示例:

interface Person<T> {

T getAttribute();

void setAttribute(T attribute);

}

3、泛型方法

在前面的泛型类中定义的如下方法:

public T getAttribute() {

return this.attribute;

}

public void setAttribute(T attribute) {

this.attribute = attribute;

}

虽然使用了参数化类型,但是并不算是泛型方法,因为这些方法中使用的参数类型是泛型类定义的。泛型方法中定义了自己使用的类型,示例:

public <T> void genericsMethod(T parameter){

//...

}

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • Java编程工具用哪个最好
    Java编程工具用哪个最好
    Java编程工具用哪个最好?Java编程工具的选择取决于个人的偏好、项目需求和开发环境。以下是一些常用的Java编程工具: 详情>>

    2024-04-03

  • 好用的Java编写软件
    好用的Java编写软件
    Java是一种广泛使用的编程语言,因其跨平台、安全性和稳定性而受到许多开发者的喜爱。Java被用于开发各种类型的软件,从桌面应用程序到企业级服务器端应用程序。以下是一些常见的、用Java编写的软件示例: 详情>>

    2024-04-02

  • Java测试工具有哪些?
    Java测试工具有哪些?
    Java测试工具有哪些?Java测试工具有很多,可以用于不同的测试阶段和目的,包括单元测试、集成测试、性能测试等。以下是一些流行的Java测试工具: 详情>>

    2024-04-02

  • Java有哪些课程?
    Java有哪些课程?
    Java是一种功能丰富且易于学习的编程语言,适用于多种不同的应用领域。目前,许多机构和在线平台都提供了丰富的Java相关课程,课程内容涵盖了Java的基础知识、高级特性以及实际应用等方面。以下是一些Java课程的示例: 详情>>

    2024-03-14

  • Java开班时间

    收起