Java泛型浅析一二

Java编程:浅析泛型类型中的桥接方法 一、什么是桥接方法 在介绍桥接方法之前,我先介绍下泛型。在 JDK1.5 中引入了泛型,泛型类型是基于原始类型、类型擦除原理进行实现的。 原始类型 Java总是会自动的为泛型类型提供一个相应的原始类型。所谓原始类型就是是指泛型的第一个限定类型(从左向右),无限定类型泛型的原始类型默认为Object。 类型擦除 Java中泛型的实现原理是类型擦除(type erasure)。类型擦除是在编译器进行代... 阅读详情

Java泛型

1. 泛型的好处

1.1 能够适用于代码复用

<T extends Number> 指定了参数类型。

public class Test0 {
    public static <T extends Number> double add(T a,T b) {
        return a.doubleValue()+b.doubleValue();
    }

    public static void main(String[] args) {
        System.out.println(Test0.add(1.0f,2l));
    }
}

运行结果

3.0

1.2.泛型能够实现类型安全

无需强制转换
在这里插入图片描述

2. 泛型的使用

2.1 简单泛型

public class Test2 {

    static class Message<T> {
        private T t;

        public T getT() {
            return t;
        }

        public void setT(T t) {
            this.t = t;
        }
    }

    public static void main(String[] args) {
        Message<String> message = new Message<>();
        message.setT("abc");
        System.out.println(message.getT());
    }
}

运行结果

abc

2.2 多元泛型

public class Test3 {

    static class Entry<K,V> {
        private K key;
        private V val;

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getVal() {
            return val;
        }

        public void setVal(V val) {
            this.val = val;
        }
    }

    public static void main(String[] args) {
        Entry<Integer,String> entry = new Entry<>();
        entry.setKey(200);
        entry.setVal("成功");
        System.out.println(entry.getKey()+","+entry.getVal());
    }
}

运行结果

200,成功

2.3 泛型接口

public class Test4 {
    interface Response<T> {
        public T getVar();
    }

    static class ResponseImpl<T> implements Response<T> {
        private T var;

        @Override
        public T getVar() {
            return var;
        }

        public void setVar(T var) {
            this.var = var;
        }

        public ResponseImpl(T var) {
            this.var = var;
        }
    }

    public static void main(String[] args) {
        Response<String> response = new ResponseImpl<>("abc");
        System.out.println(response.getVar());
    }
}

运行结果

abc

2.4 泛型方法一:方法声明

<T>声明泛型方法持有T

public class Test5 {
    public static <T> void print(T[] arr) {
        for(T t:arr) {
            System.out.print(t+"\t");
        }
    }
    public static void main(String[] args) {
        Test5.print(new String[]{"a","b","c"});
    }
}

运行结果

a	b	c	
2.4.1 泛型方法二:方法声明多参数
public class Test6 {
    public static <T,V> void print(T[] arr,V[] arr2) {
        for(T t:arr) {
            System.out.print(t+"\t");
        }
        for(V v:arr2) {
            System.out.print(v+"\t");
        }
    }
    public static void main(String[] args) {
        Test6.print(new String[]{"a","b","c"},new Integer[]{1,2,3,4,5});
    }
}

运行结果

a	b	c	1	2	3	4	5	
2.4.2 泛型方法三:用反射生成对象

通过泛型与反射创建对象

public class Test7 {
    public static <T> T getInstance(Class<T> c) {
        T t = null;
        try {
            t = c.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return t;
    }
    public static void main(String[] args) throws ClassNotFoundException {
        Object instance = Test7.getInstance(Class.forName("com.generic.O"));
        System.out.println(instance.getClass());
    }
}

运行结果

class com.generic.O

2.5 泛型方法四:泛型方法调用

在调用泛型方法时,可以指定类型,此时编译器会校验参数类型
在这里插入图片描述

3. 泛型使用中需要注意的上限与下限

3.1 问题的引入:为什么需要上限与下限

  • 问题一
public class Test8 {

    static class A {

    }

    static class B extends A {

    }

    public void putA(A a ){

    }

    public void putB(B b) {
        putA(b);
        System.out.println("自动进行类型转换,里氏替换");
    }


    public static void main(String[] args) {
        Test8 test8 = new Test8();
        test8.putB(new B());
    }
}

在这个方法可以正常调用,因为编译器会识别 putA(b);的参数类型是B。

  • 问题二
    但是如果是List类型就会报错哦.因此此处是隐含的类型转换。在这里插入图片描述

  • 用泛型解决
    <? extends A>表示该类型参数可以是A(上边界)或者A的子类类型。编译通过。

    public void putA(List<? extends A> lista ){

    }

    public void putB(List<B> listb) {
        putA(listb);
        System.out.println("自动进行类型转换,里氏替换");
    }

3.2 泛型上限与下限应用

extends 关键字声明了类型的上界;super 关键字声明了类型的下界。

public class Test11 {

    static class Point<T> {

    }

    public static void main(String[] args) {
        Point<? super Number> p1 = new Point<Object>();
        Point<? extends Number> p2 = new Point<Integer>();
    }
}

3.3 泛型多限制:同时实现多个接口

<T extends Staff & Passenger>要求泛型必须同时实现两个接口。

public class Test12 {
    interface Staff{
        int getSalary();
    }

    interface Passenger{
        boolean isStanding();
    }

    static class Person implements Staff,Passenger {
        @Override
        public int getSalary() {
            return 11110;
        }

        @Override
        public boolean isStanding() {
            return false;
        }
    }

    //工资低于2500元的上斑族并且站立的乘客车票打8折
    public static <T extends Staff & Passenger> void discount(T t){
        if(t.getSalary()<2500 && t.isStanding()){
            System.out.println("恭喜你!您的车票打八折!");
        }
    }

    public static void main(String[] args) {
        discount(new Person());
    }
}

4. 泛型的原理——了解泛型擦除

Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。

    1. 无限制类型擦除
      当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和<?>的类型参数都被替换为Object。
      在这里插入图片描述
    1. 擦除类定义中的类型参数
      在类型擦除中替换为类型参数的上界或者下界,比如形如和<? extends Number>的类型参数被替换为Number,<? super Number>被替换为Object。
      在这里插入图片描述
    1. 擦除方法定义中的类型参数
      擦除方法定义中的类型参数原则和擦除类定义中的类型参数是一样的
      在这里插入图片描述

4.1 泛型擦除的实验1

实验证明,l1 和 l2 的类型相同。

public class Test13 {
    public static void main(String[] args) {
        List<String> l1 = new ArrayList<>();
        List<Integer> l2= new ArrayList<>();
        System.out.println(l1.getClass());
        System.out.println(l2.getClass());
    }
}

运行结果

class java.util.ArrayList
class java.util.ArrayList

4.2 泛型擦除的实验2

通过反射,仍然可以向泛型类里存放字符串。

public class Test14 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> l1 = new ArrayList<>();
        l1.add(42);
        l1.getClass().getMethod("add",Object.class).invoke(l1,"abc");
        System.out.println(l1);
    }
}

运行结果

[42, abc]

4.3 泛型擦除的实验3

由于引用类型的声明没有声明为泛型,实际上什么都可以往里存。
所以泛型的检查是针对引用的,而无关它真正引用的对象。

public class Test16 {
    public static void main(String[] args) {
        List ls = new ArrayList<String>();
        ls.add("ba");
        ls.add(1);
        System.out.println(ls);
    }
}

5. 泛型的其他问题

5.1 泛型中的参数不考虑继承

泛型就是需要明确关系,如果参数是可以继承的,但是仍然不允许传递。
在这里插入图片描述

5.2 泛型的静态变量

因为泛型类中的泛型参数的实例化是在定义对象的时候指定的,而静态变量和静态方法不需要使用对象来调用。因此是错误的。
在这里插入图片描述
但是静态方法居然可以通过,请注意此T是方法声明,非类定义的泛型T。

    public static <T> T getT(){
        return null;
    }

5.3 通过反射获取泛型参数类型

public class Test20<T> {

    public static void main(String[] args) {
        Test20<Integer> genericType = new Test20<Integer>() {
        };
        Type superclass = genericType.getClass().getGenericSuperclass();
        Type type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
        System.out.println(type);//class java.lang.String
    }
}

结果:

class java.lang.Integer

5.4 关于泛型的一个思考题

看这个方法,D继承了C,覆写了C的方法。

public class Test18 {
   static class C<T>{
       private T val;

       public T getVal() {
           return val;
       }

       public void setVal(T val) {
           this.val = val;
       }
   }

   static class D extends C<String>{

       @Override
       public String getVal() {
           return super.getVal();
       }

       @Override
       public void setVal(String val) {
           super.setVal(val);
       }
   }

    public static void main(String[] args) {
        C c = new C();
        c.setVal(new Object());
        D d = new D();
        d.setVal(new Object());
   }
}

但是注意,C方法在编译期中会被擦除泛型参数,变为Object,因此D的get、set方法由于入参和返回值不一样,就不是对C的覆写了。
真的是这样吗?
运行显示,d不允许d.setVal(new Object());。可是我们之前的思路,应当父类的方法并没有被覆盖啊,是可以调用父类的方法的啊.
在这里插入图片描述
问题在于虚拟机的优化实现。
运行javap -c命令查看字节码,发现jvm帮助我们实现了子类的方法,一共有两套get和set方法,以匹配父类方法。
当然我们自己是无法这样实现的,以为编译不会通过,因为jvm违反了重载的约束,仅仅返回值不同就定义了多个方法。
在这里插入图片描述

6.常见问题

1.Java中的泛型是什么 ? 使用泛型的好处是什么?
泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。
泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。

2.Java的泛型是如何工作的 ? 什么是类型擦除 ?
泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List类型来表示。为什么要进行擦除呢?这是为了避免类型膨胀。

3.什么是泛型中的限定通配符和非限定通配符 ?
限定通配符对类型进行了限制。有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面<?>表示了非限定通配符,因为<?>可以用任意类型来替代。

4.List<? extends T>和List <? super T>之间有什么区别 ?
List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。例如List<? extends Number>可以接受List或List。

总结

泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。
泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。

java基础 系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/javabasic
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

java 带两个类型参数的泛型 java 带两个类型参数的泛型 java 带两个类型参数的泛型 立即下载

相关推荐

SSE消息推送避坑指南:从Chrome兼容性到Spring超时配置

本文深入探讨了在Java Spring Boot项目中实现SSE消息推送时,从浏览器兼容性到后端配置的完整避坑指南。针对Chrome并发连接限制、Safari自动断开、Nginx代理缓冲以及Spring SseEmitter内存泄漏与超时管理等生产环境常见问题,提供了具体的解决方案和最佳实践配置,帮助开发者构建稳定可靠的实时推送系统。

work3的博客 449

Java中的泛型

文章目录为什么要使用泛型程序定义泛型类定义泛型方法类型变量的限定 为什么要使用泛型程序 使用泛型前: public class GenericTest01 { public static void main(String[] args) { List l = new ArrayList(); l.add("abcd"); l.add(100); for(Object obj : l){ String s = (S

m0_62969222的博客 1057

MMWCAS-DSP-EVM与AWR2243实战:从开箱到数据采集的完整避坑指南

本文提供了MMWCAS-DSP-EVM与AWR2243毫米波雷达评估板从开箱、软硬件准备、固件烧录到数据采集的完整实战指南。重点解析了硬件连接、软件版本匹配、固件烧录、网络配置及MMWave Studio GUI操作等关键步骤,并汇总了常见问题排查方法,帮助开发者快速上手并规避常见陷阱。

algae的博客 503

Java泛型详解(史上最全泛型知识详解)

泛型是在JDK5之后引入的一个新特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式为用大白话来说,泛型就好比是给一个标签,通常情况下我们会在开发过程中或者个人学习或练习的过程中使用到泛型;就拿数组的泛型举例来说,我们把数组比作一个药瓶子,我们药瓶子贴上了什么标签,就只能放什么药,如果不管什么药都放在一个药瓶子里,那不得出大事吗?同样容器(数组)写上什么泛型,就只能存放什么数据;这样就不会导致我们存取数据的混乱。这样就解决了我们引言中提到的问题,也就解释了什么是泛型。

m0_70325779的博客 1万+

Axure rp9 中继器新建表格

Axure rp9 中继器新建表格

weixin_49295490的博客 1652

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2002

Java泛型(泛型类、泛型方法、泛型接口)

目录标题泛型引入1. 泛型类特点2. 最简单泛型类3. 泛型方法4. 泛型接口5. 泛型类可是同时设置多个类型参数6. 泛型的类型参数可以是泛型类7. 泛型类可以继承泛型类8. 泛型类可以实现泛型接口 泛型引入 如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同,那我们如何去做? 此时,我们就引入了泛型。 泛型:让数据类型变得参数化。定义泛型时,对应的数据类型是不确定的。泛型方法被调用时,才指定具体类型 这样就解决了多个相似的类(方法、接口 )创建的问题,一个泛型类即可代替所

one goto one 的博客 4454

Android汽车服务篇(一) CarService

本文主要说明了CarService这一系统服务的启动流程,以及一些关键成员的创建和初始化流程.同时简单介绍了一下客户端是如何获取和使用CarService对象, 如上文介绍的, CarService对象只是获取各个Manager的媒介,它本身并不承担管理传感器.空调等具体的任务.如果要获取车辆的相关信息,如车速, 车内空调温度,诊断信息, 或对车辆进行相关的控制,如升高和降低空调温度,控制座椅和车窗, 调节音量等,就要通过具体的Manager中的API和对应的服务来实现了.

u012514113的专栏 8148

Java 中的泛型(两万字超全详解)

博主将用 优快云 记录 Java 后端开发学习之路上的经验,并将自己整理的编程经验和知识分享出来,希望能帮助到有需要的小伙伴。博主也希望和一直在坚持努力学习的小伙伴们共勉!唯有努力钻研,多思考勤动手,方能在编程道路上行至所向。由于博主技术知识有限,博文中难免会有出错的地方,还望各位大佬包涵并批评指正,博主会及时改正;如果本文对小伙伴你有帮助的话,求求给博主一个赞支持一下,可以一起交流,一起加油!!Java泛型详解,史上最全图文详解java 泛型全解 - 绝对最详细Java 泛型,你了解类型擦除吗。

林二月的博客 11万+

如何使用superpowers

"这个 bug 帮我修一下" → 我会自动走 systematic-debugging → TDD → verify 流程。- "帮我添加一个登录功能" → 我会自动走 brainstorming → plan → TDD → verify 流程。只要任务有 1% 的可能性适用某个技能,我就会先调用它再行动。→ TDD(测试驱动开发)→ verification(验证)→ code review(代码审查)提出需求 → brainstorming(头脑风暴)→ writing-plans(编写计划)

xiaojingjianqiang的博客 611

CNC雕刻与VCarve Pro实战:将三维地形数据转化为木质景观时钟

计算机辅助制造(CAM)是现代数字制造的核心技术之一,它通过软件将设计模型转化为机床可执行的指令,驱动设备进行精准加工。其原理在于将三维模型离散为刀具运动路径(G代码),控制铣刀等执行机构进行“减材”成型。这项技术的价值在于实现了复杂三维形体的高精度、可重复制造,极大地拓展了创意实现的边界。在应用场景上,CAM广泛应用于模具加工、原型制作、个性化工艺品制造等领域。本文聚焦于一个具体实践:利用VCarve Pro软件,结合从在线地图服务获取的真实地形STL数据,通过CNC雕刻机在硬木上加工出具有真实地理特征的

weixin_30651345的博客 376

JAVA进阶-——泛型

目录 前言 一、泛型是什么? 二、为什么我们要使用泛型? 三、泛型的使用 3.1 泛型类 3.2 泛型方法 3.3 泛型接口 四、通配符与上下界 五、泛型在虚拟机中是如何实现的? 总结 前言 接下来一段时间,本人会将近期所看到的学到的一些知识分享在优快云上,欢迎各位大神前来交流、指教,首先会从JAVA开始,毕竟作为安卓开发工程师,JAVA是基础,后续也会更新一些安卓方面的内容。第一篇博客,是关于JAVA中的泛型。文章中的图表、代码均为原创,如需转载,请注明出处。 一、泛型是什么?

bugmaker的博客 627

华为OD机试双机位C卷-流浪地球(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷【流浪地球】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【流浪地球】。

qq_45776114的博客 3140

浅析Java中的泛型

hello !大家好! 今天的主题就是:泛型。在使用集合类时,大家就已经接触到泛型了,那就是每个集合类后面的尖括号<>,这样一对尖括号,在java中就称为泛型。那么泛型这一个点,我们又该知道多少呢?我们往下看! 文章目录一、泛型的使用二、泛型类的定义-类型边界三、类型擦除四、泛型类的使用-通配符五、泛型方法六、泛型的限制 一、泛型的使用 前面我们学集合的时候,简单的说过泛型的使用。如下: ArrayList<Integer> list = new ArrayList<>(

x0919的博客 1505

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

浅析java泛型编程

什么是泛型? 泛型主要是 Java SE 1.5 的新特性,泛型的本质就是参数化类型,什么是参数化类型呢?就是所操作的数据类型被指定为一个参数,这种参数可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 在编译阶段,识别的是<T>,在运行期识别的是Object类 泛型的意义? a.可以对类型进行自动检查 注:不是替换 仅仅是用来进行类型安全检查!! b.自动...

简之易安的博客 817

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++与Java区别浅析:泛型编程

无论C++还是Java,我们在学习集合的时候都会发现任何一种集合都没有固定匹配一种数据类型,这便是泛型编程带来的好处。C++模板与Java泛型两者在目的是一致的,都是不希望重写相同的功能,提高复用性,两者的区别是由于语言本身不同特征造成的。C++的模板主要分为函数模板与类模板,而Java泛型主要分为泛型类、泛型方法与泛型接口。...

weixin_44888859的博客 1674

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java泛型原理浅析

Java泛型浅析一、泛型定义二、泛型意义三、泛型实现四、泛型边界与通配符五、泛型动态类型安全六、泛型反射七、ResolvableType 一、泛型定义 泛型,即参数化类型,类似于函数的形参,在使用的时候可以传入具体的类型,泛型仅应用于类型之上,可以使代码应用于多种类型,使类和方法具有更广泛的表达能力。 二、泛型意义 为了使代码具有更广泛的灵活性,一般会采取以下几种方式编程: 1.重载方法,此编程方式可以增加程序的灵活性和适用性,但是编写繁琐 2.方法参数为基类,方法可以接受从这个基类导出的任何类作为参数,可

piaoyu250的博客 525

Java中关于泛型的浅析

前言 java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像...

ostracod 350

Java泛型浅析

一句话理解 泛型是一种检查机制,使得在编译时检测出错误,而不是运行时。 优点 加强安全性。 定义泛型类&接口 List list = new ArrayList<>(); 泛型方法 受限泛型 原始类型&向后兼容 通配泛型 消除泛型 泛型的限制: 1.不能使用new E();    eg:

Android_DEPON的博客 816

浅析Java泛型

泛型基础知识:泛型的类,接口,方法,继承,通配符和泛型受限。Generics Basics: Classes, Interfaces, Methods, Inheritance, Wildcard, and Generics Restrictions for Generics.

Wrysunny__的博客 411

java中泛型浅析——泛型擦除及extends和super通配符

文章目录1. 泛型的定义2. 泛型集合 1. 泛型的定义 先看一段维基百科上对Java中范泛的定义: Generics are a facility of generic programming that were added to the Java programming language in 2004 within version J2SE 5.0. They were designed to extend Java's type system to allow "a

weixin_41558411的博客 703

JAVA泛型浅析

Java范型generics,是JDK1.5引入的新特性,是一种编译时类型安全检测机制,可以在编译时检测到非法的类型。定义泛型参数时还可以使用继承,例如 ,后面都可以使用User类或它的子类接收在必要的时再强转指定类型。在方法调用时检测类型,在返回值类型之前的是范型方法的象征,此处表示声明了一个范型T,范型数量也可以多个比如;当实现范型接口的类不传范型实参:比如下面的也需要在类名增加GenericInterUser1和接口一样的范型。

Hidanchaofan的博客 680

java 多态 泛型_Java基础之多态和泛型浅析

Java基础之多态和泛型浅析一、前言:楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结二、什么是多态?多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口(这里所谓的接口是楼主自己发明的,这里不是局限于Java的interface,可以把它看作为广义定义的对象源)的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述—...

weixin_27006759的博客 823
上一篇: 二十二、状态模式——不同形态下的绿巨人
下一篇: Java注解浅析一二
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值