#1.为何要使用泛型?
1.解决元素存储的安全性问题。
在一个list钟,我原本只但愿存储String类型的对象,可是没有使用泛型时,Object类对象能够存储进去。这就形成list中元素类型不一致。
2.解决获取元素数据时,须要类型强转的问题。
在如上list中获取元素数据时,很明显获取String类型时,须要强转String;获取Object元素时,须要强转Object。
使用了泛型,1.就规定了list中存放元素的类型;2.取出元素时,不须要作类型转换。安全
public void testGeneric() { /** * 不使用泛型 */ List list = new ArrayList<>(); list.add(78); list.add(85); list.add(69); //1.不安全元素进来了 list.add(new String("AA")); for (int i = 0; i < list.size(); i++) { //2.强转出现问题 int score = (int) list.get(i); System.out.println(score); } /** * 使用泛型 */ List<Integer> list2 = new ArrayList<>(); list2.add(78); list2.add(85); list2.add(69); //不安全元素进不来 //list2.add(new String("AA")); for (int i = 0; i < list2.size(); i++) { //2.强转出现问题 int score = list2.get(i); System.out.println(score); } }
#2.自定义泛型类、泛型接口、泛型方法code
/** * 自定义泛型类 * */ public class Order<T> { private int orderId; private String orderName; private T t; private List<T> list; //用上面自定义的t public void add() { list.add(t); } //自定义泛型方法 //传入什么类型元素,就输出什么类型元素 public <E> E getE(E e) { return e; } }
使用自定义泛型类对象
public void testGeneric() { Order<String> order = new Order<>(); order.setOrderId(1001); order.setOrderName("张三"); order.setT("讲故事"); System.out.println(order); order.setList(new ArrayList<>()); //将order.getT()的值添加到order的list属性中 order.add(); System.out.println(order); //接收数据类型必须与传入数据类型一致 int tmp = order.getE(123); System.out.println(tmp); }
#3.通配符接口
public void testGeneric() { //这里?表明通配符 //便可以表明任何类型 List<?> list = null; List<Integer> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); list = list1; list = list2; }