Java泛型

老规矩,测试一下,下面的程序能否正常运行?为什么?

开头测试题

泛型就是实现了参数化类型,也就是代码可以适用于多种类型。泛型是在编译期检查的,在编译期检查类型是否安全。我认为泛型最有用的就是和集合类一起使用。

简单实现一个泛型类型

定义一个类Holder,T可以理解为一个占位符。使用时可以指定T为其他对象,就像测试代码一样,我们可以用String替换T。

一个泛型的例子

泛型类和泛型接口

上面的那个例子就是泛型类,泛型也适用于接口,我们自定义接口Gen的参数化为T,因为T类型是没办法创建实例的,这里传入Class对象,通过反射来实例化。

泛型接口

泛型方法

静态的方法无法使用类的类型参数,如果静态方法使用泛型的能力,就必须使用泛型方法(非静态的方法也可以为泛型方法)。泛型方法在返回值前定义泛型参数,大概的定义如下:

public void test(T t){}

并且泛型方法可以用在可变参数中,请判断下面的程序到底执行了那个方法?

泛型和可变参数

上面的程序是不能通过编译的,错误信息为:The method test(Integer) is ambiguous for the type TestG。因为在编译时test(T t)和test(Integer t)此时是一样的,我们的参数是Integer的时候,编译器区分不开到底调用哪个方法。

通配符

有时候不限制类型的时候,我们可以用通配符“?”,比如定一个一个List>,这个和不限制好像没有什么区别,当在map中使用的时候就能看出来有一定的用处。比如我们限制key是String类型的,value可以是任意类型的时候,我们可以用Map。

通配符使用的时候可以设置边界,关键字就是entends,语法就是,就是限制参数为某个类型的子类。比如MyClazz exnteds Number>代表MyClazz只能使用Number或者Number的子类。

看一个List中使用通配符的边界的问题,源码如下:

list添加数据问题

Integer是继承于Number,按说能添加才对吧,为什么添加不了了?原因就是add方法的参数是E,当我们使用? extends Number的时候,此时的add方法的参数就变成了了? extends Number,此时编译器不能确定使用的是哪个子类,因此编译器就直接拒绝对参数列表中涉及通配符的方法的调用。

解决这个问题的方法就是使用超类通配符,语法为 super 基类型>,意思声明通配符是由某个特定类的任何基类来界定,修改的代码如下:

超类通配符

总结下问题

1、基本类型不能作为类型参数

2、一个类不能实现同一个泛型接口的两种变体,简单来说就是继承的类和实现的接口的类型参数不同

3、使用带有泛型参数的转型或者instanceof不会有任何效果。

4、如果有两个类型参数的时候,重载时有问题的,代码如下:

重载问题

还是开头的那句话,泛型主要用在集合类中,我们起码要在集合中使用好泛型。

欢迎关注,留言,讨论,如果有任何问题,请批评指正,谢谢!

java泛型方法无参_从头再来:Java泛型(开发必须知道的)相关推荐

  1. java从头再来--java

    java从头再来–java语言 第一站 java语言 一起学习进步,欢迎留言指正 文章目录 java从头再来--java语言 一.java是什么? 1.面向对象 2.强类型编程语言 3.跨平台 二.j ...

  2. java 反射无参方法_无参构造方法 ? 反射

    若一个类中未定义默认的构造方法,当通过反射的机制这个类的实例会报下面的错误: Exception in thread "main" java.lang.[b]Instantiati ...

  3. java怎么无参构造方法_Java中如何在无参构造方法中调用有参构造?

    展开全部 一般正常的都是参数多的调用参数少的.有参数的调用无参数的居e68a843231313335323631343130323136353331333365643537多. 当然你要无参调用的参的 ...

  4. java的无参构造方法_Java有参构造方法和无参构造方法

    1.定义: 编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法:(如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效) 编写时添加了有参构造方法而未添加无参构造方法,那么 ...

  5. java的无参构造方法_Java无参构造方法的作用

    classPerson{privateStringname;//表示人的姓名privateintage;//表示人的年龄publicvoidtell(){//定义说话的方法System.out.pri ...

  6. java 包装类可以被继承_小白学Java:包装类

    小白学Java:包装类 学习了许久的Java,我们知道Java是一种面向对象的语言,万物皆对象.但是我们之前在说到Java基本数据类型的时候,由于处理对象需要额外的系统开销,于是出于对性能的考虑,基本 ...

  7. java io 网络编程_[笔面] Java IO和网络编程相关面试

    1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果. 异步:函数调用在没得到结果之前,没有调用结果,返回状态信息. 阻塞:函数调用在没得到结果之前 ...

  8. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  9. java获取机器号_(转)JAVA获得机器码的实现

    http://yangshangchuan.iteye.com/blog/2012401 首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换: Java代码  收藏代码 /** *生成机 ...

最新文章

  1. UVa 10055 - Hashmat the Brave Warrior
  2. 过滤字符串中的html标签
  3. IE兼容CSS3圆角border-radius,box-shadow,text-shadow的方法
  4. 全面讲述linux集群负载均衡
  5. Spring Boot 2.0.5 配置Druid数据库连接池
  6. 再见了微服务,DDD已成气候!
  7. 单元测试: gmock
  8. versa max_如何从Mac(和Vice Versa)打开或关闭iPhone的Safari选项卡
  9. java 双因素认证(2FA)TOTP demo
  10. 使用@property
  11. 通过伪协议解决 父页面与iframe页面通信的问题
  12. python3及wxpythonGUI多线程防假死与线程消息传递消息(最新)
  13. python模板注入_Python 模板引擎的注入问题分析
  14. 各IT岗位需要的IT职业技能有哪些?
  15. theano java_Theano多个张量作为输出
  16. 计算机2.0培训心得,信息技术应用能力提升培训心得体会两篇
  17. 7. R语言【独立性检验】:卡方独立性检验、Fisher精确检验 、Cochran-Mantel-Haenszel检验
  18. GYM 101653 T.Runes(水~)
  19. java小球左右_java小球碰撞窗体边缘来回反弹的代码
  20. 解数独 — Python

热门文章

  1. 中文转化成拼音_五笔已经淘汰,拼音到达瓶颈,百度重拳出击,全新输入方式来袭!...
  2. oracle12c 端口查看,Oracle12c修改端口号
  3. java导出excel 科学计数法_基于Java将Excel科学计数法解析成数字
  4. javabean 连接mysql_连接mysql的javabean实例+简单分页
  5. tf调不到keras怎么 回事_格力变频空调快速维修方法及技巧 空调压缩机不到一分钟就停,怎么回事?...
  6. 华为mate40RS能升级鸿蒙,mate40Pro和40RS能用上鸿蒙系统吗
  7. 我曾经是怎么做面试官的
  8. Codeforces 999F Cards and Joy 【dp】【性质】
  9. .net:Code First 创建或更新数据库
  10. 混合使用Azure LB和ILB访问相同web服务(3)