【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
一、泛型简介
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
java 泛型 与 C++ 模板 : Java 中的泛型 , 是仿照 C++ 中的 模板 开发的 , 目的是让开发者可以写出 通用 , 灵活 的代码 ;
伪泛型 : Java 中的泛型 , 是 伪泛型 , Java 泛型开发好之后 , 在 编译阶段 就 将泛型相关的信息消除 了 , 不会泛型留到运行时 ;
泛型类型 :
- 泛型方法 : 方法有参数 , 方法的参数 可以指定成一些 泛型 ;
- 泛型类 : 类 也可以有参数 , 将 类型 作为 参数 传入类中 ;
- 泛型接口 : 接口 的 参数 , 也可以是泛型 ;
将 类型 传入 泛型方法 , 泛型类 , 泛型接口 中 , 可以 动态地 指定一些类型 ;
泛型的作用 :
- 安全检查 : 在 编译阶段 , 就可以进行 代码检查 , 将更少的错误带到运行时 ;
- 避免强转 : 避免 类型的强转 导致不必要的安全问题 ;
- 提高性能 : 使用泛型可以 提高 Java 的性能 ;
二、泛型类
泛型类 : 在 类名后面 使用 <T>
声明泛型 , 则在该类中 , 可以使用该泛型类型 T 类型 ;
特别注意 , 该类中的 如下 2 2 2 个方法 不是 泛型方法 ; 其中的 参数 , 返回值 类型是 T , 但 这个 T 是作为一个正常的类型使用的 , 并不是声明在 方法 中的泛型 ;
如果 类 , 接口 , 方法 是 泛型类 , 泛型接口 , 泛型方法 , 则该 类 , 接口 , 方法 必须由 <T> 修饰 , 有个带尖括号的 T ;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
泛型类完整代码示例 :
/**
* 泛型类
* 该 T 类型作为参数使用
* T 是参数化类型 , 可以由外部传入
*
* @param <T>
*/
public class Student<T> {
private String name;
private int age;
/**
* 该数据的类型未知
* 使用泛型表示 , 运行时确定该类型
*/
private T data;
public Student(String name, int age, T data) {
this.name = name;
this.age = age;
this.data = data;
}
/**
* 该方法不是泛型方法
* 该方法是普通方法 , 返回值类型是 T 类型
* @return
*/
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
三、泛型方法
泛型方法 : 在方法的 返回值前 , 使用 <T>
声明泛型的方法 , 是泛型方法 ; 将某个类型作为参数传入 ;
泛型个数 : 该方法是泛型方法 , 且指定了 2 2 2 个泛型 , 泛型的个数可以有很多个 , 多个泛型之间 , 使用逗号隔开 ;
泛型方法 与 泛型类 中的泛型 :
-
泛型不同 : 泛型方法指定的泛型 T 与 类中的泛型 T 没有任何关系 , 这两个 T 可以是不同的类型 ;
-
泛型相同 : 泛型方法中定义的 泛型 T , 与 参数类型的 T , 返回值类型的 T , 方法内部的 T , 都是同一个类型 ;
/**
* 泛型类
* 该 T 类型作为参数使用
* T 是参数化类型 , 可以由外部传入
*
* @param <T>
*/
public class Student<T> {
private String name;
private int age;
/**
* 该数据的类型未知
* 使用泛型表示 , 运行时确定该类型
*/
private T data;
public Student(String name, int age, T data) {
this.name = name;
this.age = age;
this.data = data;
}
/**
* 泛型方法 , 是将某个类型作为参数传入
* 方法指定泛型 , 写法如下
*
* 该方法是泛型方法
* 方法指定了 2 个泛型
* 泛型个数 , 泛型的个数可以有很多个
* 多个泛型之间 , 使用逗号隔开
*
* 为方法指定的泛型 T 与类中的泛型 T 没有任何关系
* 这两个 T 可以是不同的类型
*
* 泛型方法中定义的泛型 T
* 与参数类型的 T
* 返回值类型的 T
* 方法内部的 T
* 都是同一个类型
*
* 与泛型类中的 T 完全没有关系
*
* @param <T>
* @param <A>
* @return
*/
public <T, A> T getData2(T arg){
T data = arg;
return data;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
四、静态方法的泛型
静态方法泛型 : 如果静态方法中 使用了 类中的泛型 T , 作为参数 或 返回值 , 这种使用时错误的 ;
如果必须在 静态方法 中使用泛型 T , 则该泛型 T 必须是静态方法的泛型 , 不能是类的泛型 ;
错误用法 :
正确用法 :
五、泛型类与泛型方法完整示例
/**
* 泛型类
* 该 T 类型作为参数使用
* T 是参数化类型 , 可以由外部传入
*
* @param <T>
*/
public class Student<T> {
private String name;
private int age;
/**
* 该数据的类型未知
* 使用泛型表示 , 运行时确定该类型
*/
private T data;
public Student(String name, int age, T data) {
this.name = name;
this.age = age;
this.data = data;
}
/**
* 该方法不是泛型方法
* 该方法是普通方法 , 返回值类型是 T 类型
* @return
*/
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
/**
* 泛型方法 , 是将某个类型作为参数传入
* 方法指定泛型 , 写法如下 ;
*
* 该方法是泛型方法
* 方法指定了 2 个泛型
* 泛型个数 , 泛型的个数可以有很多个
* 多个泛型之间 , 使用逗号隔开
*
* 泛型方法指定的泛型 T 与类中的泛型 T 没有任何关系
* 这两个 T 可以是不同的类型
*
* 泛型方法中定义的泛型 T
* 与参数类型的 T
* 返回值类型的 T
* 方法内部的 T
* 都是同一个类型
*
* 与泛型类中的 T 完全没有关系
*
* @param <T>
* @param <A>
* @return
*/
public <T, A> T getData2(T arg){
T data = arg;
return data;
}
/**
* 如果静态方法中使用类 类中的泛型
* 这种使用时错误的
*
* 如果必须在 静态方法 中使用泛型 T
* 则该泛型 T 必须是静态方法的泛型
* 不能是类的泛型
*
* @param arg
* @return
*/
public static <T> T getData3(T arg){
T data = arg;
return data;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/120144177
- 点赞
- 收藏
- 关注作者
评论(0)