Java中泛型的简单源码使用,<T> T、 T、<T>的用法,它们之间有何区别,<T> T与T的使用方法详解(保姆级教程)

前置知识:泛型的背景(了解)

1、Java泛型是 J2 SE1.5 中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

2、提出背景:Java集合(Collection)中元素的类型是多种多样的。例如,有些集合中的元素是Byte类型的,而有些则可能是String类型的,等等。Java允许程序员构建一个元素类型为Object的Collection,其中的元素可以是任何类型在Java SE 1.5之前,没有泛型(Generics)的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要作显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以在预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。因此,为了解决这一问题,J2SE 1.5引入泛型也是自然而然的了。

3、作用:

  • 第一是泛化。可以用T代表任意类型Java语言中引入泛型是一个较大的功能增强不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了,这带来了很多好处。
  • 第二是类型安全。泛型的一个主要目标就是提高Java程序的类型安全,使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全,在运行期可能发生ClassCast Exception异常,如果使用泛型,则会在编译期就能发现该错误。
  • 第三是消除强制类型转换。泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。
  • 第四是向后兼容。支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(Generics Java程序),但是现有的没有使用泛型扩充的Java程序仍然可以用这些编译器来编译。

下面是代码理解

一、什么是泛型

1、泛型,是指 在类定义时不指定类中信息的具体数据类型,而是暂时用一个标识符来替代,当外部实
例化对象的时候再来指定具体的数据类型。

举个例子:

在这里插入图片描述
2、泛型可以指 类中成员变量的数据类型、方法的返回值类型 以及 方法的参数类型。

//定义 A 类的时候不指定类型
public class A<泛型1,泛型2,泛型3>{
	private 泛型1 b;
	public 泛型2 test(泛型3 m){
		...
	}
}

A<B,C,D> a = new A(); //实例化时才指定

二、为什么要有泛型

  • 极大地提升程序的灵活性,提高类的扩展性。
  • 避免数据类型不一致导致的错误。

三、类型变量

T 在 Java 泛型中,被称作类型变量。那什么又是类型变量?

类型变量:在整个类的定义中用于指定方法的返回类型,同时也可以指定属性和局部变量的类型。可以用具体的类型来替换类型变量来实例化泛型类型。

如果经常看源码,就能看到很多类似于 T 这种类型变量,简单介绍一下这些类型变量分别代表什么含义。(其实用什么字母表示都可以,这里只是讲解通用的字母表示)

字母通常在哪些位置使用(含义)
T、U、S任意类型
K键类型
V值类型
E集合元素类型
N数字类型

四、<T> T/ T/<T>的区别

首先展示代码示例:

public class Test {
    public static void main(String[] args) {
        //注意:这里不能是基本数据类型,否则后期调方法传具体类型时报错
        Double[] num = {1.1,2.2,3.3};
        String[] str = {"hello","word"};

        Test01 test01 = new Test01();
        test01.one(num);
        test01.one(str);

        Test02 test02 = new Test02();
        test02.two(num);
        test02.two(str);

        Test03 test03 = new Test03();
        test03.three(num);
        test03.three(str);
    }
}

class Test01 {
    public <T> T one(T[] arr) {
        return arr[1];
    }
}

class Test02 {
    public T two(T[] arr) {
        return arr[1];
    }
}

class Test03 {
    public <T> void three(T[] arr) {
        T t = arr[1];
    }
}

先看:Test01类编写的方法的返回值样式为 <T> T,Test02类编写的方法返回值的样式为 T

① Test02报错:

注意:如果方法的返回值写成 T,那必须为泛型(也就是改成 Test02<T>,否则报错)

在这里插入图片描述

再说下 Test03:public <T> 中的这个 T 是修饰符(标识)的功能,代表这是个泛型方法。并不是返回值类型,而是表示这里传入的参数是泛型 或者 下面定义的变量是泛型。(说简单点:<T>就是确保参数中可以出现 T 这种数据类型或者 方法中定义的变量可以是 T 这种数据类型)

总结:

  • <T> T <T> 就是标识,也就是修饰 T,表明后期传入的 T 不固定。
  • T:就是简单的泛型,按照泛型的基本功能使用即可。但需要注意类后面有时候要加<T>
  • <T>:就是标识、修饰的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学鸡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值