#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); } /** * 使用泛型 */ Listlist2 = 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.自定义泛型类、泛型接口、泛型方法
/** * 自定义泛型类 * */public class Order{ private int orderId; private String orderName; private T t; private List list; //用上面自定义的t public void add() { list.add(t); } //自定义泛型方法 //传入什么类型元素,就输出什么类型元素 public E getE(E e) { return e; }}
使用自定义泛型类
public void testGeneric() { Orderorder = 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; Listlist1 = new ArrayList<>(); List list2 = new ArrayList<>(); list = list1; list = list2; }