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

相关推荐
a4576368769 分钟前
Objective-c protocol 练习
开发语言·macos·objective-c
fajianchen9 分钟前
Spring中观察者模式的应用
java·开发语言
库库林_沙琪马14 分钟前
深入理解 @JsonGetter:精准掌控前端返回数据格式!
java·前端
追风赶月、19 分钟前
【QT】控件一(QWidget、Button、Label)
开发语言·qt
手握风云-25 分钟前
JavaEE初阶第一期:计算机是如何 “思考” 的(上)
java·java-ee
MYH51626 分钟前
无监督 vs 有监督的本质区别
开发语言
Humbunklung32 分钟前
JavaScript 将一个带K-V特征的JSON数组转换为JSON对象
开发语言·javascript·json
普通的冒险者41 分钟前
微博项目(总体搭建)
java·开发语言
ubax42 分钟前
day 51 python打卡
开发语言·python
BAGAE1 小时前
Flutter 与原生技术(Objective-C/Swift,java)的关系
java·开发语言·macos·objective-c·cocoa·智慧城市·hbase