1、简介
Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。即:参数化类型。
2、作用
- 泛化:用T代表任意类型(参数化类型)。
- 类型安全:通过泛型变量类型限制,可以在更高程度上验证类型假设。如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全。
- 消除强制类型转换:泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。
- 向后兼容性:支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(Generics Java程序),现在很少用。
3、实现
泛型类
概念:如果定义的一个类有一个或多个类型变量,则可以使用泛型。
语法:public class A{}
public class Text {
public static void main(String[] args) {
A<String> a=new A<String>();//在new A的对象指定泛型的类型String
a.setK("a");
System.out.println("字符串"+a.getK());
a.setK("d");
System.out.println("字符串"+a.getK());
A<Integer> x=new A<Integer>();//在new A的对象指定泛型的类型String
x.setK(666);
System.out.println("整数型"+x.getK());
A a1=new A();//不指定泛型,相当于指定了一个Object类型
a1.setK(new Object());
Object obj=a1.getK();
System.out.println(obj);
//同样的类,但是在new对象时泛型指定不同的数据类型,这些对象不能互相赋值
}
}
/**
* 泛型类,T可以任意取名,意为type
* @author
*
* @param <T>
*/
class A<T>{
private T k;
public void setK(T k) {//获取属性,没有返回值
this.k=k;
}
public T getK() {//返回属性
return this.k;
}
}
泛型接口
概念:如果定义的一个接口有一个或多个类型变量,则可以使用泛型。
语法:interface S{ T showInfo(T t);}
public class Text3 {
public static void main(String[] args) {
S2<Object> s2 = new S2<Object>();
S3<String> s3 = new S3<String>();
System.out.println(s2.show(12));
System.out.println(s3.show("ss"));
}
}
interface S1<T> {// 泛型接口
T show(T t);// 接口方法
}
class S2<T> implements S1<T> {// 实现接口类
@Override
public T show(T t) {
return t;
}
}
/**
* 如果实现接口时指定接口的泛型的具体数据类型 这个类实现接口所有方法的位置都要泛型替换实际的具体数据类型
*
* @param <T>
*/
class S3<T> implements S1<String> {
@Override
public String show(String t) {
return t;
}
}
泛型方法
用法:是否拥有泛型方法,与其所在的类是否泛型无关;要定义泛型方法,只需将泛型参数列表置于返回值前。
语法:修饰符 <T,E,…> 返回值类型 方法名(形参列表){方法体}
public class Text2 {
public static void main(String[] args) {
R<Object> a = new R<Object>();
a.setE(12);
a.text1("qq");
a.text(2);
System.out.println(a);
System.out.println(a.getE(true));
}
}
class R<T> {
private T e;
public static <T> void text(T t) {// 静态泛型方法
System.out.println(t);
}
public <T> void setE(T eT) {// 无返回值的泛型方法
System.out.println(this.e);
}
public <T> T getE(T sT) {// 有返回值的泛型方法
return sT;
}
public <T> void text1(T... ts) {// 形参为可变参数的泛型方法
for (T s : ts) {
System.out.println(s);
}
}
}
4、注意
- 单独的T代表一个类型,Class代表这个类型所对应的类,Class代表类型不确定的类;
- E—Element(在集合里使用,因为集合里存放的是元素)、T—Type(java类)、K—Key(键);
V—Value(值)、N—Number(数值类型)、?—表示不确定的Java类型; - Set:表示集合里面是 Java类;
- List :表示集合里是 E的实例;
- List<?>: 表示集合里面对象不确定;