Java面向对象编程-泛型

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:weimengjie
 * @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: weimengjie
 * @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中循环总结:

增强了for循环使用方便,但性能较差,不适合处理超大量级的数据
迭代器的便利速度要比增强for循环块很多,是增强for循环的2被
使用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面向对象编程 ——泛型1.png
可以看到,程序类型的转换异常,但是编译器却没有报错

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值