泛型带你规避风险 | 带你学《Java面向对象编程》之六十四

简介: 本节由转型风险引出了一个新的概念-泛型,并为读者简单介绍了泛型的定义方法与泛型类实例化方法。

上一篇:危险的转型操作 | 带你学《Java面向对象编程》之六十三
【本节目标】
通过阅读本节内容,你将接触到泛型的概念,了解其规避转型风险的原理,学会定义一个简单的泛型类并能够正确地实例化泛型类。

泛型定义

如果要想避免项目之中出现“ClassCastException”最好的做法是可以直接回避掉对象的强制转换,所以在JDK1.5之后提供有泛型技术,而泛型的本质在于,类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。
那么此时就需要在类定义的时候明确定义占位符(泛型标记)。

class Point <T> {    //T是Type的简写,可以定义多个泛型
    private T x ;
    private T y ;
    public void setX(T x) {
        this.x = x ;    
    }
    public void setY(T y) {
        this.y = y ;
    }
    public T getX() {
        return this.x ;
    }
    public T getY() {
        return this.y ;
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Point point = new Point() ;
    //第一步:根据需求进行内容的设置
        point.setX(10) ;    //自动装箱
        point.setY(“北纬20度”) ;    //自动装箱
    //第二步:从里面获取数据
        int x = (Integer) point.getX() ;
        int y = (Integer) point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }  
}

此时Point中的x与y属性的数据类型并不确定,而是由外部来决定。

提示:关于默认的泛型类型

  • 由于泛型是属于JDK1.5之后的产物,但是在这之前已经有不少程序类或者接口广泛的应用在项目开发之中,于是为了保证这些类或接口追加了泛型之后,原始的程序类依然可以使用,所以如果不设置泛型类型时,自动将使用Object作为类型,以保证程序的正常执行,但是在编译的过程之中会出现警告信息。

泛型定义完成后可以在实例化对象的时候进行泛型类型的设置,一旦设置之后,里面的x与y的属性的类型就与当前对象直接绑定了。

class Point <T> {    //T是Type的简写,可以定义多个泛型
    private T x ;
    private T y ;
    public void setX(Integer x) {
        this.x = x ;    
    }
    public void setY(Integer y) {
        this.y = y ;
    }
    public T getX() {
        return this.x ;
    }
    public T getY() {
        return this.y ;
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Point<Integer> point = new Point<Integer>() ;
    //第一步:根据需求进行内容的设置
        point.setX(10) ;    //自动装箱
        point.setY(20) ;    //自动装箱
    //第二步:从里面获取数据
        int x = point.getX() ;
        int y = point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }     //执行结果:x坐标:10、y坐标:20
}

现在的程序代码之中,由于Point类里面设置的泛型类型为Integer,这样所有的对应此泛型的属性、变量、方法返回值全部替换为Integer(只局限于此对象之中),这样在进行处理的时候如果发现设置的内容有错误,则会在程序编译的时候自动进行错误提示,同时也避免了对象的向下转型处理(可以避免安全隐患)。

Point<String> pointB = new Point<String>() ;

泛型的使用注意点:

  • 泛型之中只允许设置引用类型,如果现在要操作基本类型必须使用包装类;

从JDK1.7开始,泛型对象实例化可以简化为“Point point = new Point<>()”;
使用泛型可以解决大部分的类对象的强制转换处理,这样的程序才是一个合理的设计。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:泛型类传参小助手-泛型通配符 | 带你学《Java面向对象编程》之六十五
更多Java面向对象编程文章查看此处

相关文章
|
1月前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
49 3
|
2月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
53 0
[Java]泛型
|
2月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
22 1
|
2月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
29 5
|
2月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
21 1
|
2月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
23 2
|
2月前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
24 0
|
2月前
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
26 0
|
3天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
5天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。