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

相关推荐
@卞20 小时前
C语言常见概念
c语言·开发语言
wjs202420 小时前
Eclipse 关闭项目详解
开发语言
沐知全栈开发20 小时前
《隐藏(Hide)》
开发语言
lkbhua莱克瓦2420 小时前
Java基础——方法
java·开发语言·笔记·github·学习方法
catchadmin20 小时前
PHP 依赖管理器 Composer 2.9 发布
开发语言·php·composer
q***718521 小时前
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
java·前端·spring boot
_Jimmy_21 小时前
JUC包里的同步组件主要实现了AQS的哪些主要方法
java
范纹杉想快点毕业21 小时前
《嵌入式开发硬核指南:91问一次讲透底层到架构》
java·开发语言·数据库·单片机·嵌入式硬件·mongodb
毕设源码-邱学长21 小时前
【开题答辩全过程】以 基于Python的Bilibili平台数据分析与可视化实现为例,包含答辩的问题和答案
开发语言·python·数据分析
芝麻馅汤圆儿21 小时前
c文件编译
c语言·开发语言