Java学习路线-7:泛型

简介: Java学习路线-7:泛型

第22 章 : 泛型

96 泛型问题引出

JDK >= 1.5

主要为了解决 ClassCastException


举例:

要描述一个坐标类,允许存放以下坐标数据类型

整型 x = 10, y = 20

浮点型 x = 10.1, y = 20.2

字符串型 x = 东经 10 度 , y = 北纬 20 度


可以使用Object,不过会出现转型操作

整型: 基本数据类型 -> Integer包装类 -> 自动向上转型为Object

浮点型 :基本数据类型 -> Double包装类 -> 自动向上转转型为Object

字符串型 :String对象 -> 自动向上转转型为Object


class Point{
    private Object x ;
    private Object y ;
    public Point(Object x, Object y){
        this.x = x ;
        this.y = y ;
    }
    public void setX(Object x){
        this.x = x ;
    }
     public void setY(Object y){
        this.y = y ;
    }
    public Object getX(){
        return this.x ;
    }
    public Object getY(){
        return this.y ;
    }
    @Override
    public String toString(){
        return "Point("+ this.x + ", " + this.y + ")" ;
    }
}
class Demo{
    public static void main(String[] args) {
        Point p1 = new Point(1, 2);
        System.out.println(p1); // Point(1, 2)
        int x = (Integer)p1.getX() ;
        System.out.println(x);  // 1
        Point p2 = new Point(1.1, 2.2);
        System.out.println(p2); // Point(1.1, 2.2)
        // Object 不能约束传入的参数
        Point p3 = new Point(10, "北纬20度");
        System.out.println(p3); // Point(10, 北纬20度)
    }
}

97 泛型基本定义

类中属性或方法的参数与返回值类型由对象实例化的时候动态决定

需要在类定义的时候明确的定义占位符(泛型标记)


实例化不设置泛型类型,默认使用Object

Point<Integer> p1 = new Point<Integer>(1, 2);

泛型的好处:

1、编译时检查类型,避免出现安全隐患

2、避免向下转型操作


泛型注意点:

1、只能使用引用类型,基本类型要使用包装类

2、JDK >=1.7开始可以简写


Point<Integer> p1 = new Point<>(1, 2);

使用泛型可以解决大部分的类对象强制转换处理


class Point<T>{
    private T x ;
    private T y ;
    public Point(){}
    public Point(T x, T y){
        this.x = x ;
        this.y = 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 ;
    }
    @Override
    public String toString(){
        return "Point("+ this.x + ", " + this.y + ")" ;
    }
}
class Demo{
    public static void main(String[] args) {
        Point<Integer> p1 = new Point<Integer>(1, 2);
        System.out.println(p1); // Point(1, 2)
        int x = (Integer)p1.getX() ;
        System.out.println(x);  // 1
        Point<Double> p2 = new Point<Double>(1.1, 2.2);
        System.out.println(p2); // Point(1.1, 2.2)
        Point<String> p3 = new Point<String>("东经30度", "北纬20度");
        System.out.println(p3); // Point(10, 北纬20度)
    }
}

98 泛型通配符

目前的泛型进行引用传递


class Message<T>{
    private T content;
    public void setContent(T message){
        this.content = message;
    }
    public T getContent(){
        return this.content;
    }
}
class Demo{
    public static void main(String[] args) {
        Message<String> message = new Message<>();
        message.setContent("Hello Java");
        showMessage(message);
    }
    // 只能接收Message<String> 对象
    public static void showMessage(Message<String> message){
        System.out.println(message.getContent());
        // Hello Java
    }
}

修改为通配符接收数据


public static void showMessage(Message<?> message) {
    System.out.println(message.getContent());
    // Hello Java
}

设置泛型范围


// 设置泛型上限
// ? extends 类
// 例如:只允许设置Number 或其子类
? extends Number 
// 设置泛型下限
// ? super 类
// 例如:只能够使用String 或其父类
? super String
public static void showMessage(Message<? extends Number> message) {
    System.out.println(message.getContent());
}
public static void showMessage(Message<? super String> message) {
    System.out.println(message.getContent());
}

99 泛型接口

1、实现类继续使用泛型


interface IMessage<T>{
    public void echo(T t);
}
class Messageimpl<S> implements IMessage<S> {
   public void echo(S t){
    System.out.println(t);
   }
}
class Demo{
    public static void main(String[] args) {
        Messageimpl<String> message = new Messageimpl<>();
        message.echo("Hello");
        // Hello
    }
}

2、实现类不使用泛型


interface IMessage<T>{
    public void echo(T t);
}
class Messageimpl implements IMessage<String> {
   public void echo(String t){
    System.out.println(t);
   }
}
class Demo{
    public static void main(String[] args) {
        Messageimpl message = new Messageimpl();
        message.echo("Hello");
        // Hello
    }
}

100 泛型方法

泛型方法:泛型标记写到了方法上

泛型方法不一定非要出现在泛型类中


class Demo{
    public static <T> T[] getArray(T ...args){
        return args;
    }
    public static void main(String[] args) {
        Integer[] list = getArray(1, 2, 3);
        for(int x : list){
            System.out.println(x);
            // 1 2 3
        }
    }
}

相关文章
|
2月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
397 3
|
2月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
546 1
|
3月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
569 3
|
2月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
234 4
零基础到精通的史上最强 Java 学习路线图推荐
|
2月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
234 10
|
2月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
280 1
|
2月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
482 3
|
3月前
|
算法 Java 测试技术
适合新手小白的史上最强 Java 学习路线图从基础到进阶全程指南
本Java学习路线图涵盖从基础语法、面向对象、集合框架到进阶编程、JVM原理、Spring Boot框架,再到数据库操作与实战项目开发,内容系统全面,适合零基础新手入门与进阶提升,助力掌握Java全栈开发技能。
341 4
|
3月前
|
Java 数据库连接 微服务
零基础自学 Java 全栈必备最全学习路线及知识清单方向指引
本文为零基础学习者提供完整的Java全栈学习路线,涵盖Java基础、进阶、框架、项目实战及拓展方向,助你系统掌握全栈开发技能,快速成长为优秀Java工程师。
502 6
|
3月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
392 1
下一篇
oss云网关配置