1.泛型入门
1.编译时不检查类型的异常
- 当把一个对象放入没有泛型的容器中时,对象会转换成Object类型,拿出来的时候还要通过强制转换转为想要的数据类型;
- 异常程序:
import java.util.*;
public class Collection
{
public static void main(String[] args)
{
var strList = new ArrayList();
strList.add("adsdsd");
strList.add("wwwwwwwww");
// 添加一个int类型元素
strList.add(5); //放入的时候按Object处理,拿出的时候还是原来的类型
strList.forEach(str -> System.out.println(((String) str).length())); //引发转换异常
}
}
2.使用泛型
- java5引入了“参数化类型”,允许程序在创建集合时指定集合元素的类型;例如ArrayList<String>,这种限定了容器内元素类型的方式就被称为泛型;
- 泛型示例:
import java.util.*;
public class GenericList
{
public static void main(String[] args)
{
List<String> strList = new ArrayList<String>();
strList.add("sfsdfsd");
strList.add("dfsdfsdfsdfsd");
// strList.add(5); //提示出错
strList.forEach(str -> System.out.println(str.length()));
}
}
3.Java9增强的菱形算法
- 在Java7之前,用泛型定义的对象要在前后都加上泛型说明;
- java7提出了菱形算法,允许后面不带泛型说明:
import java.util.*;
public class DiamondTest
{
public static void main(String[] args)
{
// 菱形算法会自动推导容器类型
List<String> books = new ArrayList<>();
books.add("fdsfsdf");
books.add("fsdfsdfsdf");
// 遍历数据
books.forEach(ele -> System.out.println(ele.length()));
Map<String, List<String>> schoolsInfo = new HashMap<>();
List<String> schools = new ArrayList<>();
schools.add("dsfsfa");
schools.add("dfdsfsdfsdfsd");
schoolsInfo.put("school1", schools);
//
schoolsInfo.forEach((key, value) -> System.out.println(key + "-->" + value));
}
}
2.深入泛型
1.定义泛型类、泛型接口
-
在定义类、方法、接口时使用类型形参,这个类型形参将在声明变量、调用方法时动态指定其类型;
-
定义泛型类:
public class Apple<T>
{
// 在类中定义的T类型可以用于定义变量类型
private T info;
public Apple(){} //构造器名还是原来的名称
public Apple(T info)
{
this.info = info;
}
public void setInfo(T info)
{
this.info = info;
}
public T getInfo()
{
return this.info;
}
public static void main(String[] args)
{
//可以根据泛型定义不同的实现类
Apple<String> a1 = new Apple<>("字符串");
System.out.println(a1.getInfo());
Apple<Double> a2 = new Apple<>(5.67);
System.out.println(a2.getInfo());
}
}
2.从泛型类派生子类
- 泛型类派生子类,子类不能带有泛型提示符,且父类要明确传入的泛型类型:
public class A1 extends Apple<String>
{
// 重写父类的方法
public String getInfo()
{
return "子类" + super.getInfo();
}
}
3.并不存在泛型类
- 对于Java来讲,不论泛型形参传入什么实参,它们依然被当作同一个类处理;所以静态方法、静态变量不能使用泛型;