为什么需要泛型?
同样的代码逻辑,只是参数类型不同,就需要再写一个方法
public int compareInt(Integer x, Integer y) {
if (x.compareTo(y) > 0){
return x;
}else {
return y;
}
}
public Float compareFloat(Float x, Float y) {
if (x.compareTo(y) > 0){
return x;
}else {
return y;
}
}
public void test(){
compareInt(1,2);
compareFloat(1f,2f);
}
如果我们用了泛型,就可以不写那么多方法
public <T extends Comparable> T compareCommon(T x, T y) {
if (x.compareTo(y) > 0){
return x;
}else {
return y;
}
}
public void test(){
compareCommon(1,2);
compareCommon(1f,2f);
}
使用泛型指定数据类型,不需要强制类型转换,可以在编译期发现异常
public void sys() {
//不使用泛型 编译期正常,但是一运行就会报错“java.lang.ClassCastException”异常
ArrayList list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add(111);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i);
System.out.println("name" + name);
}
//使用泛型限定类型
ArrayList<String> list2 = new ArrayList();
list2.add("CCC");
//编译期就会报错
//list2.add(222);
for (int i = 0; i < list2.size(); i++) {
String name2 = list2.get(i);
System.out.println("name2" + name2);
}
}
总结泛型的好处:
- 适用于多种数据类型执行相同的代码
- 泛型中的类型在使用时指定,不需要强制类型转换
泛型类
可以有多个参数
public class Normal1<T> {
private T data;
}
public class Normal2<T, K> {
private T data1;
private K data2;
}
泛型接口
public interface Normal3<T>{
public T next();
}
两种不同的实现 T string
泛型方法
public <T> T getName(T a){
return (T) (a+"1");
}