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(); ^ |
| | |

相关推荐
西门吹-禅40 分钟前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_1 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk81631 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19871 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码1 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby2 小时前
Spring Security
java·后端·spring
IT笔记3 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode3 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇3 小时前
C# 运算符重载详解
开发语言·后端·c#
我才是银古3 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri