关于泛型你不得不知道的事

泛型

泛型在整个java体系当中占有很大的地位,尤其是在面向对象编程和设计模式这一块,更是得到了广泛的应用。所以我们很有必要去详细的深入的去了解泛型。

一、背景
public static void main(String[] args) {
    // 1.我们同学们经常使用集合一直使用的是泛型的集合,这里我们
    //   使用一个非泛型的集合做一个案例
    ArrayList arrayList = new ArrayList();
    // 2.如果没有采用集合我们这个集合在存储元素的时候存储的是一个Object类型
    //    我们可以看到以下案例使用起来非常的方便,在一个ArrayList的集合当中,
    //    可以存储任意类型的元素
    arrayList.add("java");
    arrayList.add(10);
    arrayList.add(true);
    // 3.我们来使用一个这个集合
    for (int i =0;i<arrayList.size();i++){
        // 在这个地方用Object 类型去接收,因为在存储的时候存储的是Object
        Object o = arrayList.get(i);
        // 这里我们在使用的时候我们不能用Object类型来使用,还是还转化成相关类型才行
        // 假如我们转化成String类型那么一定会产生错误 // ClassCastException
        String value = (String) o;
        System.out.println(value);
    }

}

这种错误很可怕,它属于运行时异常,也就是说如果我们没有注意到,那么我们的项目一旦上线,就有可能中断我们这整个项目。

总结:
java推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程当中,需要程序员知道每个元素的数据类型,否则很容易产生ClassCastException.

二、泛型的概念
public static void main(String[] args) {
        // 1.我们现在使用一个泛型的集合来进行数据的存储,我们指定类型的集合为String
        ArrayList<String> StrList = new ArrayList<>();
        // 2.在这个地方我们在调用add()方法的时候,默认我们存储的是String类型
        //   我们去尝试存储非字符串类型的数据时,时会在编译期间报错的
        //  StrList.add(100);
        //  StrList.add(true);
        StrList.add("java");
        StrList.add("Spack");
        StrList.add("python");

        // 3.变量集合,我们来看一下使用的是什么类型来做接收
        for (int i = 0;i<StrList.size();i++){
            String s = StrList.get(i);
        }

        // 总结: 泛型的好处
        // 1.在这个地方泛型给我们提供了一个编译期间的检查,进而避免ClassCastException错误
        // 2.我们在获取集合当中的元素的时候讲不在需要进行类型的转化

        System.out.println("-----------------------");
        
        ArrayList<Integer> InterList = new ArrayList<>();
 
        InterList.add(100);
        InterList.add(200);
        InterList.add(300);
        
    }

泛型的好处

在这里插入图片描述

总结:
java泛型是JDK5引入的一个新的特征,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时监测到非法的类型数据。
泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。

三、泛型的好处
  • 类型安全
  • 消除了强类型的转化
四、具体用法
  • 泛型类的定义语法
class 类名称 <泛型标识、泛型标识,...> {
    private 泛型标识 变量名;
    ......
}
常用的泛型标识 T、E、K、V

案例

/**
 * 泛型类的定义
 * @param <T> 泛型标识-----类型形参
 *           T 创建对象的时候里面具体制定的数据类型
 */
public class Generic<T> {

    // T 是由外部使用类的时候来指定的。
    private T key;

    public Generic(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    @Override
    public String toString() {
        return "Generic{" +
                "key=" + key +
                '}';
    }
}


泛型类的使用语法

使用语法

类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();

java 1.7以后,后边的<>中具体的数据类型可以省略不写

类名<具体的数据类型> 对象名 = new 类名<>();
如下是案例:
public static void main(String[] args) {
    // 泛型类在创建对象的时候来指定操作的具体数据类型
    Generic<String> stringGeneric = new Generic<>("a");
    String key = stringGeneric.getKey();
    System.out.println("key:" + key);

    System.out.println("------------------------");
    Generic<Integer> integerGeneric = new Generic<>(100);
    Integer key1 = integerGeneric.getKey();
    System.out.println("key1:"+key1);
    // 总结:泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。
    
    System.out.println("----------注意点1:--------------");
    // 泛型类在创建对象的时候,没有指定泛型类,将按照Object类型来操作
    Generic generic = new Generic("ABC");
    Object key3 = generic.getKey();
    System.out.println("key3:"+key3);
    
    System.out.println("----------注意点2:--------------");
    // 泛型类不支持基本数据类型,原因就是我们在编译期间会将这个 T 编译成 Object
    // 基本数据类型无法转化为 object类型
    // Generic<int> intGeneric = new Generic<>(100);
    
    System.out.println("----------注意点3:--------------");
    // 同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型
    System.out.println(integerGeneric.getClass() == stringGeneric.getClass());

}

总结:泛型类注意事项

泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
泛型的类型参数只能是类类型,不能是基本数据类型
泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型

intln(integerGeneric.getClass() == stringGeneric.getClass());

}


**总结:泛型类注意事项**

泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
泛型的类型参数只能是类类型,不能是基本数据类型
泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值