Java泛型<T> T与T的使用方法详解

网友投稿 449 2022-12-02


Java泛型<T> T与T的使用方法详解

泛型(Generic type 或者 generics)是对 java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运http://行时传递的值的占位符一样。

在集合框架(Collection framework)中泛型的身影随处可见。例如,Map 类允许向一个 Map 类型的实例添加任意类的对象,即使最常见的情况在给定映射(map)中保存一个string键值对。

命名类型参数

对于常见的泛型模式,推荐的泛型类型变量:

E:元素(Element),多用于java集合框架

K:关键字(Key)

N:数字(Number)

T:类型(Type)

V:值(Value)

大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦除,正确理解泛型概念的首要前提是理解类型擦除。Java 泛型是如何工作的?什么是类型擦除?答:泛型是通过类型擦除来实现的,编译器在编译时擦除了所有泛型类型相关的信息,所以在运行时不存在任何泛型类型相关的信息,譬如 List 在运行时仅用一个 List 来表示,这样做的动机是兼容 Java 1.5 之前版本。

泛型擦除具体来说就是在编译成字节码时首先进行类型检查,然后进行类型擦除(即所有类型参数都用他们的限定类型替换,包括类、变量和方法),最后如果类型擦除和多态性发生冲突,就在子类中使用桥http://接方法解决;如果调用泛型方法的返回类型被擦除,则在调用该方法时插入强制类型转换。在类型擦除中,编译器确保不会创建额外的类,并且没有运行时开销。

类型擦除原则

用通用类型的类型参数替换其绑定的有界类型参数;

如果使用无界类型参数,则使用Object替换类型参数;

插入类型转换以实现类型安全;

生成桥接方法以在扩展通用类型中保持多态。

T 和T的区别:T是Type的首字母缩写; T 表示“返回值”是一个泛型,传入什么类型,就返回什么类型;而单独的“T”表示限制传入的参数类型。

T 的用法

这个 T 表示返回值T的类型是泛型,T是一个占位符,用来告诉编译器,这个东西是先给我留着, 等我编译的时候再告诉你是什么类型。

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;

import java.util.List;

public class Demo {

public static void main(String[] args) {

Demo demo = new Demo();

//获取string类型

List array = new ArrayList();

array.add("test");

array.add("doub");

String str = demo.getListFisrt(array);

System.out.println(str);

//获取Integer类型

List nums = new ArrayList();

nums.add(31);

nums.add(32);

Integer num = demo.getListFisrt(nums);

System.out.println(num);

}

/**

* 这个 T 可以传入任何类型的List

* 关于参数T

* 第一个 表示是泛型

* 第二个 表示返回的是T类型的数据

* 第三个 限制参数类型为T

*

* @param data

* @return

*/

SQyNuAZEprivate T getListFisrt(List data) {

if (CollectionUtils.isEmpty(data)) {

return null;

}

return data.get(0);

}

}

T 的用法

单独的T表示限制参数的类型。这种用法一般多用于共同操作一个类对象,然后获取里面的集合信息。

import java.util.ArrayList;

import java.util.List;

public class Demo2 {

public static void main(String[] args) {

//限制T 为String 类型

Demo2 demo = new Demo2();

List array = new ArrayList();

array.add("Tom");

array.add("河南");

String str = demo.getListFisrt(array);

System.out.println(str);

//获取Integer类型

Demo2 demo2 = new Demo2();

List nums = new ArrayList();

nums.add(12);

nums.add(13);

Integer num = demo2.getListFisrt(nums);

System.out.println(num);

}

/**

* 这个只能传递T类型的数据

* 返回值 就是Demo 实例化传递的对象类型

*

* @param data

* @return

*/

private T getListFisrt(List data) {

if (data == null || data.size() == 0) {

return null;

}

return data.get(0);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入了解java NIO之Selector(选择器)
下一篇:Idea导入多个maven项目到同一目录下的方法示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~