Java面向对象编程-泛型#

泛型的作用:

泛型使得程序变得更加强壮,代码也跟房价精炼。Java语言支持泛型,但是在JVM中会擦除泛型

泛型的使用:

在集合声明和实现的后面加上<>,在里面写上指定的类型,这个集合就只能存放指定的元素类型了

语法格式:

List<String>  blacklast = new ArrayList<String>();

指定泛型之后,如果存放其他类型,编译器就会报错;

下面以List和Map为例,展示在使用泛型后代码的变化

List:

package Demo01;

import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0
 * @author: jiazhihao
 * @date: 2021-05-18 08:51
 */
public class Demo01 {
    public static void main(String[] args) {
        List<String> blacklist = new ArrayList<String>();
        blacklist.add("张三");
        blacklist.add("李四");


        for (String string : blacklist) {
            System.out.println("老赖" + string);
        }

    }
}

Map:

package Demo01;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0
 * @author: jiazhihao
 * @date: 2021-05-18 08:54
 */
public class Demo02 {
    public static  void main(String[] args) {
        Courier guo = new Courier("a1","小郭","男",22,"上海");
        Courier mu = new Courier("a2","穆大姐","nv",28,"郑州");

        Map<String,Courier> map = new HashMap<String,Courier>();
        map.put(guo.getName(), guo);
        map.put(mu.getName(), mu);
        for (Map.Entry<String,Courier> entry:map.entrySet()){
            System.out.println("姓名:"+entry.getKey() + "年龄:"+entry.getValue());
        }
    }
}

Map中循环总结:

  1. 增强了for循环使用方便,但性能较差,不适合处理超大量级的数据
  2. 迭代器的便利速度要比增强for循环块很多,是增强for循环的2被
  3. 使用entrySet 遍历的速度要比KeySet快很多,是KeySet的1.5倍左右

常见的泛型表示:

  • E表示Element
  • K表示Map的key
  • V代表Map的value
  • T代表Type
  • 如果不清楚需要神魔类型,可以用问号嗲表类型。这在反射和方法继承时使用频繁

泛型接口和泛型方法

标准库中的集合都可以使用泛型,这样具有很高的通用性。当自己开发的类和接口也想使用泛型获得后的通用性,该怎么办?

代码;

public static String loophole(Integer x) {
    List<String> ys = new LinkedList<String>();
    List xs = ys;
    xs.add(x); 
    return ys.iterator().next();
}

public static void main(String[] args) {
    loophole(123);
}

java Action 传递参数 泛微 java泛型传递对象_泛型

可以看到,程序类型的转换异常,但是编译器却没有报错

这样的原因是,泛型是通过 java 编译器的称为擦除(erasure)的前端处理来实现的。你可以(基本上就是)把它认为是一个从源码到源码的转换,它把泛型版本的 loophole()转换成非泛型版本。 结果是,java 虚拟机的类型安全和稳定性决不能冒险,即使在又unchecked warning 的情况下。

擦除去掉了所有的泛型类型信息。所有在尖括号之间的类型信息都被扔掉了,因此,比如说一个 List类型被转换为 List。所有对类型变量的引用被替换成类型变量的上限(通常是 Object)