Java笔记之泛型

本文详细介绍了Java中的泛型,包括其作用、优点和泛型通配符的使用。泛型提供类型安全,避免了运行时类型转换,提高了代码的重用性。同时,解释了泛型对数据类型没有实际影响,因为编译器会进行类型擦除。此外,还讨论了泛型通配符的三种类型:无界、上界和下界。
摘要由CSDN通过智能技术生成

目录

什么是泛型?

为什么使用泛型?

泛型对数据类型有影响吗?

泛型通配符

思考问题


什么是泛型?

Java中泛型就是将数据类型指定为参数,可作用于类、接口及方法的创建中。

为什么使用泛型?

1.保证类型安全,在编译阶段实现类型检查

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

public class Demo01 {

    public static void main(String[] args) {
        //未指定泛型类型的的list
        List  list = new ArrayList<>();
        //指定泛型类型为String的list
        List<String>  strList = new ArrayList<>();

        //未指定泛型类型的list可以添加任意类型的数据
        list.add("hello world");
        list.add(100);

        //指定泛型类型为String的list只可以添加String类型的数据,当添加int类型时编译报错
        strList.add("hello world");
        
        strList.add(100);//此处出现编译错误
    }
}

 2.避免类型转换硬编码

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

public class Demo02 {
    /**
     * 以定义两个List用于操作String类型数据为例
     */
    public static void main(String[] args) {
        
        //未指定泛型类型的list
        List list = new ArrayList();
        //指定泛型类型为String的list
        List<String> strList = new ArrayList<>();
        
        list.add("not genuse demo");
        list.add("test data");

        strList.add("genuse demo");
        strList.add("test data");

        /**
         * 在上面的两个list,对于开发人员来说都是已知用于存储操作string类型的,
         * 在取出来的时候,未指定泛型类型的需要添加强制转换代码,指定泛型类型的
         * list数据取出即是指定的泛型类型不需强制转换,如下代码:
         */
        String firstItem1 = (String)list.get(0);
        String firstItem2 = strList.get(0);
    }
}

 3.提高代码的重用性

        在日常开发中为了使有些类、接口及方法的适用范围更广,通常都会使用泛型来达到此目的。比如计算机的加方法,如果一开始只定义为整数类型相加,那么后续要衍生出其它数据类型(double、float、long等)的加法则需要不断添加方法,这是不可取的。此时泛型即可帮我们达到代码可重用性的目的。

/**
 * 实现Cal接口並指定数据操作类型
 */
public class CalDemo implements Cal<Integer>{

    public Integer add(Integer num1, Integer num2){
        return num1 + num2;
    }
}
/**
 * 定义通用的泛型接口
 * @param <T> 泛型参数
 */
public interface Cal <T>{

    /**
     * 两数相加
     * @param num1 加数一
     * @param num2 加数二
     * @return 相加结果
     */
    T add(T num1, T num2);
}

泛型对数据类型有影响吗?

不会。

原因是泛型只对编译器起作用,在编译期间java编译器会进行类型擦除。可通过查看编译文件验证此论证。命令如下:

javap -verbose

泛型通配符

用于定义泛型界限的符号,主要有以下三种类型:

  • 无通配符:<?>
  • 上界通配符:<? extends E>
  • 下界通配符:<? super E>
import java.util.List;

public class Demo03 {

    /**
     * 无界通配符,任何类型参数的List都可做为参数
     * @param list
     */
    public void unbound(List<?> list){

    }
    /**
     * 上界通配符,类型参数为Number子类的List都可做为参数
     * @param list
     */
    public void upLimit(List<? extends Number> list){

    }
    /**
     * 下界通配符,类型参数为Number父类的List都可做为参数
     * @param list
     */
    public void downLimit(List<? super Number> list){

    }
}

思考问题

什么是泛型桥接?

什么是堆污染?

以上内容仅代表个人理解,如有不足欢迎指正,请多多包涵,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值