Java泛型是JDK1.5引入的新特性,本质是参数化类型,将类型作为参数传递
常见形式:泛型类、泛型接口、泛型方法
语法:<T,…> T称为类型占位符,表示一种引用类型,通常有E、K、V
优势:提高代码重用性、防止类型转换异常、提高代码安全性
1.泛型类
/**
* 泛型类
* 语法:类名<T>
* T是类型占位符,表示一种引用类型,可以使用多个 <T,E,K,V,...>
*/
public class MyGeneric<T> {
//使用泛型T
//创建类型
T t;
//泛型作为方法的参数
public void show(T t){
System.out.println(t);
}
//泛型作为方法的返回值
public T getT(){
return t;
}
}
创建测试类
public class TestGeneric {
public static void main(String[] args) {
//使用泛型类创建对象
MyGeneric<String> myGeneric = new MyGeneric<String>();
myGeneric.t = "hi,java";
myGeneric.show("hi,php");
String string = myGeneric.getT();
System.out.println(string);
MyGeneric<Integer> myGeneric2 = new MyGeneric<Integer>();
myGeneric2.t = 10;
myGeneric2.show(20);
Integer integer = myGeneric2.getT();
System.out.println(integer);
}
}
注意点
1.泛型只能使用引用类型
2.不同泛型类型对象之间不能相互赋值
2.泛型接口
创建一个泛型接口
/**
* 泛型接口
* 语法:接口名<T>
* 不能泛型静态常量
*/
public interface MyInterface<T>{
String name = "杨洋";
T server(T t);
}
创建接口的实现类
不可选择类型
public class MyInterfaceImpl implements MyInterface<String>{
@Override
public String server(String t) {
System.out.println(t);
return t;
}
}
可选择类型
public class MyInterfaceImpl2<T> implements MyInterface<T> {
@Override
public T server(T t) {
System.out.println(t);
return t;
}
}
测试类
public class TestGeneric {
public static void main(String[] args) {
//不可选择类型实现 String
MyInterfaceImpl impl = new MyInterfaceImpl();
impl.server("runrunrun");
//可选择类型实现
MyInterfaceImpl2<Integer> impl2 = new MyInterfaceImpl2<>();
impl2.server(999);
}
}
3.泛型方法
/**
* 泛型方法
* 语法:<T>方法返回值类型
*/
public class MyGenericMethod {
//泛型方法
public <T> T show(T t) {
System.out.println("泛型方法: " + "(" + t.getClass().getTypeName() + "):" + t);
return t;
}
}
测试类
public class TestGeneric {
public static void main(String[] args) {
//泛型方法
MyGenericMethod myGenericMethod = new MyGenericMethod();
myGenericMethod.show("sin");
myGenericMethod.show(100);
myGenericMethod.show(3.14);
myGenericMethod.show(true);
}
}
4.泛型集合
参数化类型、类型安全的集合,强制集合元素的类型必须一致
1.编译时即可检查,而非运行时抛出异常
2.访问时,不必类型转换(拆箱)
3.不同泛型之间引用不能相互赋值,泛型不存在多态
创建一个Animals类
import java.util.Objects;
public class Animals {
private String name;
private int age;
private String shout;
public Animals(String name, int age, String shout) {
this.name = name;
this.age = age;
this.shout = shout;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getShout() {
return shout;
}
public void setShout(String shout) {
this.shout = shout;
}
//重写toString方法
@Override
public String toString() {
return "Animals{" +
"name='" + name + '\'' +
", age=" + age +
", shout='" + shout + '\'' +
'}';
}
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animals animals = (Animals) o;
return age == animals.age && Objects.equals(name, animals.name) && Objects.equals(shout, animals.shout);
}
}
创建测试类
import java.util.ArrayList;
import java.util.ListIterator;
public class Demo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("haha");
arrayList.add("hehe");
for (String string: arrayList) {
System.out.println(string);
}
ArrayList<Animals> arrayList2 = new ArrayList<>();
Animals lion = new Animals("狮",4,"qqq");
Animals tiger = new Animals("虎",4,"www");
Animals dove= new Animals("鸽",4,"eee");
arrayList2.add(lion);
arrayList2.add(tiger);
arrayList2.add(dove);
ListIterator<Animals> it = arrayList2.listIterator();
while(it.hasNext()){
Animals s = it.next();
System.out.println(s);
}
}
}