java中的泛型

泛型:

为什么要泛型:

a.解决元素存储的安全性问题, 好比商品、 药品标签, 不会弄错。
b.解决获取数据元素时, 需要类型强制转换的问题, 好比不用每回拿商品、 药 品都要辨别

在集合中使用泛型有什么好处

上代码:

    ArrayList<Integer> list = new ArrayList<>();//类型推断
    list.add(78);
    list.add(88);
    list.add(77);
    list.add(66);
    //遍历方式一:
    //for(Integer i : list){
    //不需要强转
    //System.out.println(i);
    //}
    //遍历方式二:
    Iterator<Integer> iterator = list.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }

    Map<String,Integer> map = new HashMap<String,Integer>();
    map.put("Tom1",34);
    map.put("Tom2",44);
    map.put("Tom3",33);
    map.put("Tom4",32);
    //添加失败
    //map.put(33, "Tom");
    Set<Entry<String,Integer>> entrySet = map.entrySet();
    Iterator<Entry<String,Integer>> iterator = entrySet.iterator();
    while(iterator.hasNext()){
       Entry<String,Integer> entry = iterator.next();
       System.out.println(entry.getKey() + "--->" + entry.getValue());
}

好处:使用泛型的主要优点是能够在编译时而不是在运行时检测错误

泛型的声明:

interface List<T> 和 class GenTest<K,V>

其中, T,K,V不代表值,而是表示类型。 这里使用任意字母都可以。
常用T表示,是Type的缩写

泛型的实例化:

一定要在类名后面指定类型参数的值(类型)。如:

List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();

注意:

a.T只能是类,不能用基本数据类型填充。但可以使用包装类填充
b.把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想

通配符:' ? '(英文的问号)

比如: List<?> , Map<?,?>
List<?>是List<String>、 List<Object>等各种泛型List的父类。

使用案例:


public static void main(String[] args) {
  List<?> list = null;
  list = new ArrayList<String>();
  list = new ArrayList<Double>();
  // list.add(3);//编译不通过
  list.add(null);
  List<String> l1 = new ArrayList<String>();
  List<Integer> l2 = new ArrayList<Integer>();
  l1.add("尚硅谷");
  l2.add(15);
  read(l1);
  read(l2);
}
public static void read(List<?> list) {
  for (Object o : list) {
      System.out.println(o);
  }
}

注意点:
1:编译错误:不能用在泛型方法声明上,返回值类型前面<>不能使用?

public static <?> void test(ArrayList<?> list){
}

2:编译错误:不能用在泛型类的声明上

class GenericTypeClass<?>{
}

3:编译错误:不能用在创建对象上,右边属于创建集合对象

ArrayList<?> list2 = new ArrayList<?>();

有限制的通配符

只允许泛型为Number及Number子类的引用调用

<? extends Number> // (无穷小 , Number]

只允许泛型为Number及Number父类的引用调用

<? super Number> //[Number , 无穷大)

只允许泛型为实现Comparable接口的实现类的引用调用

<? extends Comparable>

通配符的使用


public static void printCollection3(Collection<? extends Person> coll) {
  //Iterator只能用Iterator<?>或Iterator<? extends Person>.why?
  Iterator<?> iterator = coll.iterator();
  while (iterator.hasNext()) {
      System.out.println(iterator.next());
  }
}
public static void printCollection4(Collection<? super Person> coll) {
  //Iterator只能用Iterator<?>或Iterator<? super Person>.why?
  Iterator<?> iterator = coll.iterator();
  while (iterator.hasNext()) {
      System.out.println(iterator.next());
  }
}
posted @ 2021-10-27 00:19  xyongz  阅读(33)  评论(0)    收藏  举报