Java泛型
概述
Java泛型是jdk1.5版本以后引入的一个新特性,其本质是参数化类型,也就是把类型作为参数传递;
常见的形式有泛型类、泛型接口、泛型方法、泛型集合;
语法:
< T > T 称之为类型占位符,表示一种引用类型,(当然<>里边可以是其他字母,在实际应用中会转为具体的类型);
好处:
- 提高代码的重用性,如重载
- 防止类型转换异常,提高代码安全性
泛型类
泛型类的声明,就是在类名后面添加类型参数声明。类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。
泛型类的一个泛型参数,也被称为一个类型变量,用于指定一个泛型类型名称的标识符,这些类被称为参数化的类或参数化的类型。
语法:类名 < T >
代码:
//声明泛型类
public class MyGeneric<T> {
//使用泛型
//创建变量
T t;
//作为方法参数创建方法
public void method(T t) {
System.out.println(t);
}
//作为方法返回值使用
public T method2() {
System.out.println(t);
return t;
}
//测试类
public class Test {
public static void main(String[] args) {
//使用泛型类创建对象
//<>里给出具体实际的参数类型
MyGeneric<String> myGeneric = new MyGeneric<String>();
myGeneric.t=("Hello Generic!");
String s = myGeneric.method2();
myGeneric.method("你好,泛型");
}
}
输出结果:
Hello Generic!
你好,泛型
泛型接口
泛型接口的声明,就是在接口名后面添加类型参数声明,其和泛型类相似。
语法:接口名 < T >
代码:
//泛型接口
public interface MyInterface<T> {
String name = "张三";
T server(T t);
}
//实现类
public class MyInterfaceImpl implements MyInterface<String> {
@Override
public String server(String s) {
System.out.println(s);
return s;
}
}
//测试类
public class Test {
public static void main(String[] args) {
MyInterfaceImpl myInterface=new MyInterfaceImpl();
myInterface.server("你好,泛型");
}
}
输出结果:
你好泛型
ps:如果在实现接口的时候不确定类型,依旧使用泛型接口,在最后实例化的时候再进行类型确定,则可以有如下实现:
//实现类2
public class MyInterfaceImpl2<T> implements MyInterface<T> {
@Override
public T server(T t) {
System.out.println(t);
return t;
}
}
//测试类
public class Test {
public static void main(String[] args) {
MyInterfaceImpl2<String> myInterface2=new MyInterfaceImpl2<String>();
myInterface2.server("你好,泛型");
}
}
输出结果:
你好,泛型
泛型方法
泛型方法的声明,就是在 方法返回值类型前面 添加类型参数声明。
语法:< T > 方法返回值类型
代码:
一个普通类下创建的泛型方法,返回值为T;
public <T> T method(T t){
System.out.println(t);
return t;
}
//测试类
public class Test {
public static void main(String[] args) {
MyMethod myMethod = new MyMethod();
myMethod.method("你好泛型");
myMethod.method(520);
myMethod.method(13.14);
}
}
输出结果:
你好泛型
520
13.14
ps:泛型类型是由传递的数据所决定的,传递什么类型的数据,泛型类型就是什么类型
泛型集合
概念:参数化类型,类型安全的集合,强制集合元素的类型必须一致。
特点:
- 编译时即可检查,而非运行时抛出异常;
- 访问时,不必类型转换(拆箱);
- 不同泛型之间引用不能相互赋值,泛型不存在多态。
代码:
public static void main(String[] args) {
ArrayList<String > list = new ArrayList<String>();
list.add("你好");
list.add("中国");
list.add("我爱你");
//因为ArrayList定义了为String类型,所有就不能添加Integer类型数值
//list.add(520);
for (String s:list){
System.out.println(s);
}
}
输出结果:
你好
中国
我爱你