泛型
1. 基本概念
- 本质:参数化类型,把类型作为参数传递;
- 常见形式:泛型类、泛型接口、泛型方法;
- 语法: <T,…>,T称为类型占位符,表示一种引用类型。可以写多个,用逗号隔开;
- 好处:
- 提高代码重用性;
- 防止类型转换异常,提高代码安全性。
2. 泛型类示例
泛型类代码:
public class MyGeneric01<T> {
//使用泛型T
//1. 创建变量
T t;
//2. 泛型作为方法的参数
public void show(T t){
System.out.println(t);
}
//3. 泛型作为方法的返回值
public T getT(){
return t;
}
}
泛型实现类:
public class TestMyGeneric {
public static void main(String[] args) {
//使用泛型创建对象
MyGeneric01<String> myGeneric = new MyGeneric01<String>();
myGeneric.t = "hello";
myGeneric.show("大家好");
String myString = myGeneric.getT();
System.out.println(myString);
}
}
输出:
注意:
- 不同的泛型类之间不能相互复制
如下代码所示,这样的操作是不允许的
MyGeneric01<Integer> myGeneric02 = new MyGeneric01<Integer>();
myGeneric02 = myGeneric;
3. 泛型接口
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 MyInterfaceImpl02<T> implements MyInterface<T> {
@Override
public T server(T t) {
System.out.println(t);
return t;
}
}
测试类:
public class TestDemo02 {
public static void main(String[] args) {
MyInterfaceImpl impl1 = new MyInterfaceImpl();
String s = impl1.server("ss");
MyInterfaceImpl02<Integer> impl2 = new MyInterfaceImpl02<Integer>();
Integer i = impl2.server(111);
}
}
测试结果:
4. 泛型方法
public class MyGenericMethod {
//无返回值
public <T>void show(T t){
System.out.println(t);
}
//有返回值
public <T> T show2(T t){
T t2 = t;
System.out.println("泛型方法2:"+t);
return t2;
}
}
测试类:
public class MyGenericMethodTest {
public static void main(String[] args) {
MyGenericMethod mgmd = new MyGenericMethod();
mgmd.show("国庆快乐");
String s = mgmd.show2("中秋快乐");
Integer i = mgmd.show2(1212);
Double d = mgmd.show2(3.14);
}
}
测试结果:
5.泛型集合
- 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致
- 特点:
- 编译时即可检查,而非运行时抛出异常
- 访问时,不必类型转换(拆箱)
- 不同泛型之间引用不能相互赋值,泛型不存在多态
举例说明:
import java.util.ArrayList;
public class GenericCollectionDemo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王五");
//遍历
for (String s :arrayList){
System.out.println(s);
}
}
.add(“张三”);
arrayList.add(“李四”);
arrayList.add(“王五”);
//遍历
for (String s :arrayList){
System.out.println(s);
}
}
这里,把arrayList直接约束为String类型(也可以约束为Student类),故只能向里面添加String类型的数据。这样,后面遍历时就不用再强制转换数据类型。