原做法:

Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");

泛型做法:

Map<K,V> m = new HashMap()<K,V>;
m.put("key", "blarg");//非<K,V>类型无法操作
String s = m.get("key");//获取无须强制转换

1:泛型(Generic type 或者 generics),对象类型的扩展,在对象类型相同情况下的一个参数化限定。

2:好处:提高程序的类型安全,将类型检查从运行时提前到编译时,入参限定检查阻止错误输入,出参无须强制类型转换。原类型可能对应的Object限定,实际运用需要更加细化。

3:它是编译阶段的类型检查,加泛型不影响JVM和类文件,反射操作可绕过泛型限定;

4:适用对象:除了异常类型、枚举或匿名内部类以外,任何类都可以具有类型参数

5:方式:声明对象时,使用<>加上大写单字母,

  字母推荐: K —— 键,比如映射的键。 
        V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。 
        E —— 异常类。 
        T —— 泛型。

6:注意:泛型不是 协定 的(协定的意思:假设A扩展自B,则使用B的地方可以使用A,即A是B的一种,非协变即泛型不支持继承,比较严格)

 协定eg:

  Integer[] intArray = new Integer[10]; 
  Number[] numberArray = intArray;//valid

 非协定eg1:

  List<Integer> intList = new ArrayList<Integer>();
  List<Number> numberList = intList; // invalid

  numberList.add(new Float(3.1415));//编译出错,此处numberList是intList引用

 非协定eg2:

  void printList(List l) { //入参I可能因为参数类型限定为原始类型而出现类型不安全,假设入参为List<Integer>
    for (Object o : l)
      System.out.println(o);
  }

 

 非协定eg3:

  void printList(List<Object> l) { //假设入参为List<Integer>,而List<Integer>不是List<Object>,参看非协变eg1.
    for (Object o : l) 
      System.out.println(o); 
  }

 由此引出 通配符 ? 通配符的引入在于可以安全检索元素(类型的任意限定肯定是扩展自Object),而非添加元素(编译器并不知道原类型的限定,添加是未知的,不被允许的)

 非协定eg4:

  void printList(List<?> l) { //List<?> 是任何泛型 List 的父类型,所以完全可以将 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 传递给 printList()
    for (Object o : l) 
      System.out.println(o); 
  }

7:泛型类(在类定义中添加一个形式类型参数列表),根据该定义可以在多个方法签名中实施类型约束

8:方法的泛型化与所在的类是否为泛型类无关,泛型方法用于在该方法的多个参数之间宣称一个类型约束

eg:

  public <T> T ifThenElse(boolean b, T first, T second) {//不用显式地告诉编译器T是什么,它只需要做到带T的参数及返回值都是同一类型即可
    return b ? first : second;
  }

9:泛型类和泛型方法的选择

  a:当泛型方法是静态方法时,编译器无法知道该类到底是什么泛型,故不用泛型类而用泛型方法

  b:当T约束仅针对方法,局部约束的时候不需要泛型类,因为泛型类的约束会导致所有的实例对象都是用的同一个T,导致该方法也是使用的同一个T,而存在这种需求:A类的实例a1和a2的方法的类型约束不需要一样;

10:限定类型,附加约束(类-----无泛型,类类型-------一般泛型,类类型约束------带约束泛型)

eg:

  public class Matrix<V extends Number> { ... }//Matrix由哪个泛型限定不知道,但必须是Number或Number子类;若无泛型,假设由Object限定,这样可以解释List.get() 在 List<?> 上调用时返回 Object

  public static void main(String[] args) {
    Matrix<Number> in = new Matrix<Number>();//valid

    Matrix<Integer> in = new Matrix<Integer>();//valid

    Matrix<Float> in = new Matrix<Float>();//valid

  }

整理自:http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html

转载于:https://www.cnblogs.com/onlyEnglish/p/8784787.html

JAVA泛型--待续相关推荐

  1. java中的single_解析java泛型(一)

    对于我们java中的泛型,可能很多人知道怎么使用并且使用的还不错,但是我认为想要恰到好处的使用泛型,还是需要深入的了解一下它的各种概念和内部原理.本文将尽可能的囊括java泛型中的重要的概念.主要内容 ...

  2. java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客

    Java泛型 泛型类 即把不确定的数据元素类型用一个泛型占位符表示@Data public class Person { private T name; private T address; }Per ...

  3. Java泛型 通配符? extends与super

    本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T ...

  4. 泛型java博客园,Java深度历险之Java泛型

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

  5. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

  6. 聊一聊Java 泛型通配符 T,E,K,V,?

    欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...

  7. 聊一聊Java 泛型中的通配符 T,E,K,V,?

    点击上方"方志朋",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:glmapper juejin.im/post/5d57 ...

  8. JAVA泛型的基本使用

    Java1.5版本号推出了泛型,尽管这层语法糖给开发者带来了代码复用性方面的提升,可是这只是是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了. 笔者发现非常多几年开发经验的程序猿,依 ...

  9. 用了这么多年的 Java 泛型,你对它到底有多了解?|原创

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

最新文章

  1. POJ1185:火炮(减少国家)
  2. 01背包问题:回溯法和限界分支、递归和迭代方式
  3. 感觉要火!妹子实地采访网易猪厂程序员七夕怎么过
  4. 近期机器学习竞赛汇总~总奖池超三百万人民币!
  5. C语言中连续两个printf,在C中两个连续的printf()调用的奇怪行为
  6. C# for循环①护栏长度 ②广场砖面积 ③判断闰年平年
  7. mooc中的习题--然后是几点
  8. 沉寂了多年金价为何会连续上涨 专家指出真正原因
  9. php redis 设置密码,redis如何修改默认密码
  10. bat批处理命令大全(翻译转载)
  11. R语言非度量多维标尺排序NMDS及一般加性模型GAM映射教程
  12. 安装GitExtentions KDiff3已配置为合并工具,kdiff3的路径未配置
  13. 在gamit中对rinex3的转换
  14. 安装ipa-server
  15. 软件架构模式 mark Richards - 读后总结 5 - 基于空间的架构
  16. BFD1从北京顺义新国展到酒仙桥特斯拉办公室
  17. 摄像头 - 屏幕刷新率(Hz)与帧率(fps)的区别与关系
  18. python打开文件管理器
  19. ios UIView全部API解读
  20. 国际战略中aaa模式_AAA游戏中的微交易将继续存在(但仍然很糟糕)

热门文章

  1. 混合模式商城的可经销商品池
  2. HTML设置字体颜色1008无标题,如何在HTML中设置字体颜色,你知道这几种方式吗?...
  3. C++面试常见问题整理汇总(面试者必看哦!)
  4. python编程快速上手-----让繁琐工作自动化_Python编程快速上手让繁琐工作自动化--逗号代码和字符图网格...
  5. php简单网站源码包含数组_PHP无限分级阶梯递归数组排列 以及多层嵌套数组在网页中的解析源码...
  6. et超排真正免狗能用版 真正好用的东西_真正合格小户型,收纳都特别能“装”...
  7. SDH与PDH的区别介绍
  8. PCM设备在雷达通信系统应用
  9. 光纤收发器不同品牌之间的兼容性互通
  10. 什么是工业级交换机?工业交换机作用有哪些?