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

相关推荐
圆山猫6 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
微学AI6 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
城管不管6 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨6 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
豆瓣鸡7 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖7 小时前
Java深入解析篇九之NIO详解
java·网络·nio
韭菜炒鸡肝天7 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
The Chosen One9857 小时前
高进度算法模板速记(待完善)
java·前端·算法
Aaron - Wistron8 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy12393102169 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python