NX_Java_06 泛型

脑中要构想出连贯的动画,一切都是以这个动画为基础的;然后给别人讲明白

泛型

  • 理解:
     其本质是 参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为 泛型类、泛型接口、泛型方法

  • 泛型类、泛型接口demo演示;注意:静态方法上不能直接使用类上定义的泛型;静态方法中可以使用方法上定义的泛型

public class GenricMethod<K,V> {
    /**
     * 1、实体方法使用类上定义的泛型
     * @param k
     * @param v
     * @return
     */
    public K method1(K k,V v){
        return null;
    }

    public <T> T method02(){ //2、方法上定义泛型
        return null;
    }


    /**
     * 静态方法中不能直接使用类上定义的泛型
     * 静态方法中可以使用方法上定义的泛型
     * @return
     */
//    public static V method03(){
//        return null;
//    }

    public static <P> P method04(){
        return null;
    }

}

  • 泛型接口,可以参照mybatis-plus的BaseService和BaseMapper的实现
public interface CalGenneric <T>{

    T add(T a,T b);
    T sub(T a,T b);
    T mul(T a,T b);
    T div(T a,T b);
}
public class DoubleCalc<Double> implements CalGenneric<Double>{
    @Override
    public Double add(Double a, Double b) {
        return null;
    }

    @Override
    public Double sub(Double a, Double b) {
        return null;
    }

    @Override
    public Double mul(Double a, Double b) {
        return null;
    }

    @Override
    public Double div(Double a, Double b) {
        return null;
    }
}

public class IntCal implements Cal {

    @Override
    public int add(int a, int b) {
        return 0;
    }

    public double add(double a, double b) {
        return 0;
    }

    @Override
    public int sub(int a, int b) {
        return 0;
    }

    @Override
    public int mul(int a, int b) {
        return 0;
    }

    @Override
    public int div(int a, int b) {
        return 0;
    }
}
  • 泛型的通配符:
    在这里插入图片描述
  1. 无界通配符 ? 【相当于Object】
  2. 上界通配符 ?extends Number 【只能比Number小的】
  3. 下界通配符 ? super Integer 【只能比Integer大的】
public interface SuperClass<T> {
    T m01(T param);
}
public class SubClass implements SuperClass<String> {
    @Override
    public String m01(String param) {
        return param + "---";
    }
}
public class BridgeMethosTest {
    public static void main(String[] args) {
        SuperClass subClass = new SubClass(); // 多态

        System.out.println(subClass.m01("123abc"));
        System.out.println(subClass.m01(new Object())); //mo1(object)
    }
}


使用javap -v SubClass.class 查看字节码文件,会看到子类中的方法m01存在两个,如下图,一个形参是String类型,另一个是Object类型。object的方法 flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC,此处是编译器自动生成的方法。 整个流程大概是对象调用泛型Object形参的方法,object的m01方法又调用了String的方法导致报错。【 5: invokevirtual #8 // Method m01:(Ljava/lang/String;)Ljava/lang/String;】

Last modified 2021-8-2; size 975 bytes
MD5 checksum 149a338e69adb923b1b205f45d13437a
Compiled from “SubClass.java”
public class com.nx.vip.javacore.generic.bridge.SubClass extends java.lang.Object implements com.nx.vip.javacore.generic.bridge.SuperClass<java.lang.String>
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #10.#29 // java/lang/Object.""😦)V
#2 = Class #30 // java/lang/StringBuilder
#3 = Methodref #2.#29 // java/lang/StringBuilder.""😦)V
#4 = Methodref #2.#31 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#5 = String #32 // —
#6 = Methodref #2.#33 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#7 = Class #34 // java/lang/String
#8 = Methodref #9.#35 // com/nx/vip/javacore/generic/bridge/SubClass.m01:(Ljava/lang/String;)Ljava/lang/String;
#9 = Class #36 // com/nx/vip/javacore/generic/bridge/SubClass
#10 = Class #37 // java/lang/Object
#11 = Class #38 // com/nx/vip/javacore/generic/bridge/SuperClass
#12 = Utf8
#13 = Utf8 ()V
#14 = Utf8 Code
#15 = Utf8 LineNumberTable
#16 = Utf8 LocalVariableTable
#17 = Utf8 this
#18 = Utf8 Lcom/nx/vip/javacore/generic/bridge/SubClass;
#19 = Utf8 m01
#20 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#21 = Utf8 param
#22 = Utf8 Ljava/lang/String;
#23 = Utf8 MethodParameters
#24 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object;
#25 = Utf8 Signature
#26 = Utf8 Ljava/lang/Object;Lcom/nx/vip/javacore/generic/bridge/SuperClass<Ljava/lang/String;>;
#27 = Utf8 SourceFile
#28 = Utf8 SubClass.java
#29 = NameAndType #12:#13 // “”😦)V
#30 = Utf8 java/lang/StringBuilder
#31 = NameAndType #39:#40 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#32 = Utf8 —
#33 = NameAndType #41:#42 // toString:()Ljava/lang/String;
#34 = Utf8 java/lang/String
#35 = NameAndType #19:#20 // m01:(Ljava/lang/String;)Ljava/lang/String;
#36 = Utf8 com/nx/vip/javacore/generic/bridge/SubClass
#37 = Utf8 java/lang/Object
#38 = Utf8 com/nx/vip/javacore/generic/bridge/SuperClass
#39 = Utf8 append
#40 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#41 = Utf8 toString
#42 = Utf8 ()Ljava/lang/String;
{
public com.nx.vip.javacore.generic.bridge.SubClass();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object.""😦)V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/nx/vip/javacore/generic/bridge/SubClass;
public java.lang.String m01(java.lang.String);
descriptor: (Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder.""😦)V
7: aload_1
8: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: ldc #5 // String —
13: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
19: areturn
LineNumberTable:
line 6: 0
LocalVariableTable:
Start Length Slot Name Signature
0 20 0 this Lcom/nx/vip/javacore/generic/bridge/SubClass;
0 20 1 param Ljava/lang/String;
MethodParameters:
Name Flags
param
public java.lang.Object m01(java.lang.Object);
descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: aload_1
2: checkcast #7 // class java/lang/String
5: invokevirtual #8 // Method m01:(Ljava/lang/String;)Ljava/lang/String;
8: areturn
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lcom/nx/vip/javacore/generic/bridge/SubClass;
MethodParameters:
Name Flags
param synthetic
}
Signature: #26 // Ljava/lang/Object;Lcom/nx/vip/javacore/generic/bridge/SuperClass<Ljava/lang/String;>;
SourceFile: “SubClass.java”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值