2023.8 - java - 泛型

泛型问题的引出:

jdk 1.5 引出泛型

java 复制代码
// package 泛型;
public class index {
    public static void main (String[] args){
        test t = new test();
        t.setContent("aaa");
        int a = (int) t.getContent();
        System.out.println(a);
    }
}

class  test{
     Object  content;
    public static void main (String[] args) throws Exception{
    }
    
    public void setContent(Object content) {
        this.content = content;
    }

    public Object getContent() {
        return content;
    }

}

|------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 编译结果 | Ok |
| 执行结果 | Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') |

可以看出该程序 获取类型 时 ,虽然 获取内容时 设置的变量类型有误,但是编译的时候却没有 报错。当执行的时候报错:强制向下转型错误 classCastException 。给程序的开发带来很大的安全性和不便。

使用泛型后:

java 复制代码
// package 泛型;
public class index {
    public static void main (String[] args){
        test<String> t = new test<String>();
        t.setContent("aaa");
        int a = (int) t.getContent();
        System.out.println(a);
    }
}

class  test<T>{
     T  content;
    public static void main (String[] args) throws Exception{
    }

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }

}

|------|------------------------------------------------------|
| 编译结果 | 不兼容的类型: String无法转换为int int a = (int) t.getContent(); |
| | |

正确使用:

java 复制代码
public class index {
    public static void main (String[] args){
        test<Integer> t = new test<Integer>();
        t.setContent(999);
         int  a =  t.getContent();
        System.out.println(a);
    }
}

需要了解的是:

1、泛型必须传 的是引用数据类型,如果传基本数据类型。这个过程会有 一个自动的 装箱(用包装类转引用数据数据类型)和 拆箱 (转基本数据类型) 处理 。

2、在 JDK1.7 之后

java 复制代码
  test<Integer> t = new test<Integer>();

可以简化为:

java 复制代码
  test<Integer> t = new test<>();

3、如果一个程序定义了泛型类,但是没有设置反省的类型,为了保证程序运行,会使用Object作为泛型的类型。

java 复制代码
// package 泛型;
public class index {
    public static void main (String[] args){
        test t = new test ();
        t.setContent("999");
         int  a =  t.getContent();
        System.out.println(a);
    }
}

class  test<T>{
     T  content;
    public static void main (String[] args) throws Exception{
    }

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }

}

|------|-------------------------------------------------------|
| 编译结果 | 错误: 不兼容的类型: Object无法转换为int int a = t.getContent(); ^ |
| | |

相关推荐
weixin_307779132 分钟前
Azure Synapse Dedicated SQL pool企业权限管理
开发语言·数据仓库·sql·azure·etl
三思而后行,慎承诺5 分钟前
Kotlin 常见问题
开发语言·面试·kotlin
青瓦梦滋5 分钟前
【语法】C++的继承
开发语言·c++
lynn-6611 分钟前
JAVA-使用Apache POI导出数据到Excel,并把每条数据的图片打包成zip附件项
java·apache·excel
一颗知足的心38 分钟前
Go语言之路————接口、泛型
开发语言·golang
沉到海底去吧Go1 小时前
【图片识别改名】批量读取图片区域文字识别后批量改名,基于Python和腾讯云的实现方案
开发语言·python·腾讯云
振鹏Dong1 小时前
JVM | CMS垃圾收集器详解
java·jvm
情报员0071 小时前
Java练习6
java·算法·排序算法
MarkHD1 小时前
第一天 车联网定义、发展历程与生态体系
开发语言·php
andrew_12191 小时前
JVM的内存管理、垃圾回收、类加载和参数调优
java·jvm