泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候就可以使用泛型

泛型也可以看出是一个变量,用来接受数据类型

  E e :Element 元素

  T t: Type 类型

  1. /*
  2. Collection<E> extends Iterable<E>,所有单鞋集合恶斗可以使用增强for
  3.  
  4. public interface Iterable<T>
  5. 实现此接口允许对象成为“for-each loop”语句的目标。
  6.  
  7. 增强for循环,用来遍历结合和数组
  8. 格式:
  9. for(集合/数组的数据类型 变量名:集合名/数组名){
  10. sout(变量名)
  11. }
  12. */
  1. /*
  2. 使用泛型
  3. 避免类型转换的满分,存储时什么类型,出去就是什么类型
  4. 运行期间异常,提到编译期的异常
  5. */
  6.  
  7. ////创建集合对象,不用泛型
  8. // 集合不使用泛型,默认的类型是object类型,可以存储任意类型的数据
  9. // 不安全,会引发异常
  1. public class DemoFor {
  2. public static void main(String[] args) {
  3. show1();
  4. show2();
  5. }
  6.  
  7. /*
  8. 使用泛型
  9. 避免类型转换的满分,存储时什么类型,出去就是什么类型
  10. 运行期间异常,提到编译期的异常
  11. */
  12. private static void show2(){
  13. ArrayList<String> list = new ArrayList<>();
  14. list.add("BBB");
  15. Iterator<String> it = list.iterator();
  16. while (it.hasNext()){
  17. String s = it.next();
  18. // int i= it.next().length();不能进行流式编程
  19. System.out.println(s);
  20. System.out.println(s.length());
  21. }
  22. }
  23.  
  24. ////创建集合对象,不用泛型
  25. // 集合不使用泛型,默认的类型是object类型,可以存储任意类型的数据
  26. // 不安全,会引发异常
  27. private static void show1(){
  28. ArrayList list = new ArrayList();
  29. list.add("DDDD");
  30. list.add(1);
  31.  
  32. // 迭代器遍历
  33. Iterator it =list.iterator();
  34. while (it.hasNext()){
  35. Object obj = it.next();
  36. System.out.println(obj);
  37. // 想要使用String类特有的方法,length获取字符串的长度,
  38. // 现在不能使用,因为多态 object obj = "obj" 不能使用子类特有的方法
  39. // 需要向下转型 String s = (String)obj;
  40. //// 会抛出异常ClassCastException,不能把Integer类型转换为String类型
  41. // String s = (String)obj;
  42. // System.out.println(s.length());
  43. }
  44.  
  45. }
  46. }
  47. /*
  48. DDDD
  49. 1
  50. BBB
  51. 3
  52.  
  53. */

自定义泛型:

自定义一个泛型类:

  1. /*
  2. 定义含有泛型的类,模拟ArrayList
  3. 泛型是一个位置的数据类型,当我们不确定什么数据类型的时候,可以使用泛型
  4. 泛型可以接受任意数据类型,可以使用String ,Integer
  5. 创建对象的时候确定泛型的数据类型
  6. */
  7. public class Gennerice<E> {
  8. private E name;
  9.  
  10. public E getName() {
  11. return name;
  12. }
  13.  
  14. public void setName(E name) {
  15. this.name = name;
  16. }
  17. }

实例化:

  1. public class GenericeDo {
  2. public static void main(String[] args) {
  3. // 不写泛型,默认是objcet
  4. Gennerice gc = new Gennerice();
  5. gc.setName("dddd");
  6. Object obj = gc.getName();
  7.  
  8. // 创建对象,使用泛型Intager
  9. Gennerice<Integer> gc2 = new Gennerice<>();
  10. gc2.setName(999);
  11. Integer name = gc2.getName();
  12. System.out.println(name);
  13.  
  14. // 使用字符串类型
  15. Gennerice<String> gc3 = new Gennerice<>();
  16. gc3.setName("RRRR");
  17. String name2 = gc3.getName();
  18. System.out.println(name2);
  19. }
  20. }

含有泛型的方法

  1. /*
  2. 定义含有泛型的方法,泛型定义在修饰符和返回值之间
  3. 格式:
  4. 修饰符 <泛型> 返回值类型 方法名 (参数列表(使用泛型)){
  5. 方法体
  6. }
  7. 含有泛型的方法,在调用方法的时候确定泛型的数据类型,传递什么类型的参数,泛型就是什么类型
  8.  
  9. */
  1. public class GenericMethod {
  2.  
  3. public <M> void methon(M m){
  4. System.out.println(m);
  5. }
  6.  
  7. // 含有泛型的静态方法:
  8. public static <S> void methon2(S s){
  9. System.out.println(s);
  10. }
  11. }

测试:

  1. public class GmTest {
  2. public static void main(String[] args) {
  3. GenericMethod gm = new GenericMethod();
  4. // 调用泛型方法,传递什么类型就是什么类G型
  5. gm.methon(10);
  6. gm.methon("ddd");
  7.  
  8. gm.methon2("静态方法的调用,不建议创建对象使用");
  9.  
  10. // 静态方法,通过类名.方法名 直接调用
  11. GenericMethod.methon2(999);
  12. GenericMethod.methon2("quan");
  13. }
  14. }
  15.  
  16. /*
  17. 10
  18. ddd
  19. 静态方法的调用,不建议创建对象使用
  20. 999
  21. quan
  22. */

含有泛型的接口

  1. public interface GenerInterface<I> {
  2. // 抽象函数
  3. public abstract void method(I i);
  4.  
  5. }

第一种使用方式:

  1. /*
  2. 含有泛型的接口:第一种:定义接口的实现,指定接口的泛型
  3. */
  4. public class GenInterTest implements GenerInterface<String> {
  5. @Override
  6. public void method(String s){
  7. System.out.println(s);
  8. }
  9.  
  10. }

第二种使用方式:

  1. /*
  2. 第二种使用方式,
  3. 接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
  4. 相当于定义了一个含有泛型的类,实现对象的时候觉得泛型的数据类型
  5. */
  6. public class GenInterTest2<I> implements GenerInterface<I>{
  7. @Override
  8. public void method(I i) {
  9. System.out.println(i);
  10. }
  11.  
  12. }

测试:

  1. public class GenInterTestALl {
  2. public static void main(String[] args) {
  3. GenInterTest git = new GenInterTest();
  4. git.method("done");
  5.  
  6. //
  7. GenInterTest2<Integer> git2 = new GenInterTest2<>();
  8. git2.method(111);
  9.  
  10. GenInterTest2<String> git3 = new GenInterTest2<>();
  11. git3.method("WUQN");
  12. }
  13. }
  14. /*
  15. done
  16. 111
  17. WUQN
  18. */

泛型通配符:

泛型的上限限定:

java的泛型hei的更多相关文章

  1. [改善Java代码]Java的泛型是类型擦除的

    泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generi ...

  2. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  3. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  4. Java 泛型 Java使用泛型的意义

    Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性 ...

  5. 跟着刚哥梳理java知识点——泛型(十三)

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  6. 【Java】泛型学习笔记

    参考书籍 <Java核心技术:卷1> 泛型, 先睹为快 先通过一个简单的例子说明下Java中泛型的用法: 泛型的基本形式类似于模板, 通过一个类型参数T, 你可以"私人定制&qu ...

  7. [转] Java 的泛型擦除和运行时泛型信息获取

    原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...

  8. Java 容器 & 泛型:五、HashMap 和 TreeMap的自白

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Java 容器的文章这次应该是最后一篇了:Java 容器 系列. 今天泥瓦匠聊下 Maps. 一.Ma ...

  9. 【译】9. Java反射——泛型

    原文地址:http://tutorials.jenkov.com/java-reflection/generics.html ===================================== ...

随机推荐

  1. “百度杯”CTF比赛 九月场Upload

    首先生成一个php文件以下源代码: <script language="PHP">$fh=fopen("../flag.".strtolower(& ...

  2. kali linux安装nessus

    详细介绍在 Kali 中安装 Nessus 的详细过程步骤以及插件下载失败解决方法. 实验环境 安装过程 下载 Nessus 安装 Nessus 启动 Nessus 获取激活码 登陆 web 界面 N ...

  3. 带你玩转CompletableFuture异步编程

    前言 最近在忙生活的第一个OKR,这个等等后面具体聊聊,今天开始恢复每周一篇原创,感谢小伙伴的不离不弃.这篇文章也是最近在Code Review的时候,看到的大家代码,想整体推下大家异步编程的思想,由 ...

  4. iOS 通知扩展插件

    iOS 通知扩展插件 目录 iOS 通知扩展插件 Notification Service Extension 新建一个target 代码实现 注意事项 UINotificationConentExt ...

  5. 【C# .Net GC】强制垃圾回收 和System GC

    属性 GC.MaxGeneration:获取系统当前支持的最大代数. 方法 GC.GetTotalMemory(bool forceFullCollection) 方法  true表示该方法先做垃圾收 ...

  6. 【C#】String| StringBuilder 字符

    原文链接:https://www.cnblogs.com/huameitang/p/10528646.html 字符串是用于表示文本的字符的有序集合. String对象是对象的有序集合 System. ...

  7. CVE-2022-22947 Spring Cloud Gateway SPEL RCE复现

    目录 0 环境搭建 1 漏洞触发点 2 构建poc 3 总结 参考 0 环境搭建 影响范围: Spring Cloud Gateway 3.1.x < 3.1.1 Spring Cloud Ga ...

  8. 爬虫之Beautfulsoup模块及新闻爬取操作

    今日内容概要 IP代理池的概念及使用 requests其他方法补充 Beautifulsoup模块 避免你自己写正则表达式 利用该模块爬取京东的商品信息 今日内容详细 IP代理池的概念及使用 1.有很 ...

  9. 在java的继承中你是否有这样的疑惑?

    一.问题 最近在写代码,有两个属性很相近的类,其中80%的属性(字段)都是一样的,剩下的才是各自不一样的,在设计的时候,采用了继承的方式,抽象除了一个父类,大概如下, 有FirstChild和Seco ...

  10. Log4j2详解——XML配置详解

    Log4j2详解--XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db