泛型概念
泛型是JDK1.5(5.0)以后増加的,它可以帮助我们建立类型安全的集合。
泛型的本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参数传入。我们可以把“泛型”理解为数据类型的一个占位符(类似:形式参数),即告诉编译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
使用
1.把类型当做参数来使用
2.参数类型只能是引用值
优点
在不使用泛型的情况下,我们可以使用Object类型来实现任意的参数类型,但是在使用时需要我们强制进行类型转换。这就要求程序员明确知道实际类型,不然可能引起类型转换错误;但是,在编译期我们无法识别这种错误,只能在运行期发现这种错误。使用泛型的好处就是可以在编译期就识别出这种错误,有了更好的安全性;同时,所有类型转换由编译器完成,在程序员看来都是自动转换的,提高了代码的可读性
,就是使用泛型主要是两个好处:
◆代码可读性更好【不用强制转换】
◆程序更加安全【只要编译时期没有警告,运行时期就不会出现 Classcast Exception异常】
类型擦除
泛型主要用于编译阶段,会在编译时把泛型擦除。
在编译后,会被替换成Object,运行时虚拟机并不知道泛型
主要是为了代码的编写方便以及安全性的检查
泛型使用
数据类型的占位符
可以使用任何字符,一般使用:E、T、K、V、N、?
泛型标记 | 对应单词 | 说明 |
---|---|---|
E | Element | 表示容器中使用表示容器中的元素 |
T | Type | 表示普通的JAVA类 |
K | Key | 表示健 如 Map中的健Key、 |
V | Value | 表示值 |
N | Number | 表示数值类型 |
? | 表示不确定JAVA的类型 |
泛型类
把泛型定义在类上,在使用的时候才把类型确认下来,类名称后添加一个或多个类型参数声明< T >、 <T、K、V>
package main;
public class MyGenerics<T> {
private T flag;
public void setFlag(T flag) {
this.flag = flag;
}
public T getFlag() {
return this.flag;
}
}
test
package main;
public class Test {
public static void main(String[] args) {
MyGenerics<String> objectMyGenerics = new MyGenerics<>();
objectMyGenerics.setFlag("123");
System.out.println(objectMyGenerics.getFlag() + 1);
MyGenerics<Integer> objectMyGenerics1 = new MyGenerics<>();
objectMyGenerics1.setFlag(123);
System.out.println(objectMyGenerics1.getFlag() + 1);
}
}
//可以在使用改类时候,再定义类的类型
泛型接口
package main;
public interface IGeneric<T> {
T getName(T name);
}
实现类
package main;
public class IGenericImpl implements IGeneric<String> {//给定具体类型
@Override
public String getName(String name) {
return null;
}
}
泛型方法
是指将方法的参数类型定义为泛型,方便在调用的时候接受不同的参数,可有多个
package main;
public class MethodGeneric {
public <T> void setName(T name) {
System.out.println(name);
}
public <T> T setTName(T name) {
System.out.println(name);
return name;
}
}
package main;
public class Test03 {
public static void main(String[] args) {
MethodGeneric methodGeneric = new MethodGeneric();
methodGeneric.setName(2234);
methodGeneric.setName("thing");
methodGeneric.setTName("113");
methodGeneric.setTName(1111);
}
}
可以看到 我们可以直接传任意类型参数,并且都正常运行
静态方法泛型
静态泛型中,不允许使用类定义的泛型。
public static <T> void setstr(T str) {
if (str instanceof String) {
System.out.println(str + " is a String");
} else {
System.out.println(str + " not a String");
}
}
package main;
public class Test04 {
public static void main(String[] args) {
MethodGeneric.setstr("张三");
MethodGeneric.setstr(111);
}
}
泛型方法可变参数
public <T> void method(T...args){
for(T t:args){
System.out.println(t);
}
}
package main;
public class Test05 {
public static void main(String[] args) {
MethodGeneric methodGeneric = new MethodGeneric();
String[] arr = new String[]{"a", "b", "c"};
Integer[] arr1 = new Integer[]{1, 2, 3};
methodGeneric.method(arr);
methodGeneric.method(arr1);
}
}
所以,无论是传入String数组还是Integer数组,可以正常使用
全文件下载 0积分
链接: java基础泛型 学习全文件.