`
君淋天下
  • 浏览: 31788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于java泛型的一些概念

阅读更多

关于java泛型其实挺复杂的,之前看文档的时候做过一些泛型名词摘记,今天把这这个笔记放到博客上来,以后抽空完善这篇关于泛型的文章  

一  类型参数(Type parameters)

二  泛型子类型(Subtyping)  
    有点违反OOP的直觉
  List<String>  listStr = new ArrayList<String>();
  List<Object> listObj = listStr;  不允许

三 泛型通配符(Wildcards):
     Collection<?> 和Collection<Object>区别
     type parameter is ?, it stands for some unknown type.  ?表示未知类型

四  边界通配符(Bounded Wildcards):
  List<Shape> shapes 与List<? extends Shape> shapes2的区别
List<? extends Shape> shapes2允许接收类型为Shape和Shape的子类型
   Shape是通配符的上界

五  泛型方法(Generic Methods)  
  static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) { 
        c.add(o); // compile-time error
    }
}
  编译错误,正确的写法是static后面void的前面加上泛型声明
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
        c.add(o); // Correct
    }
}

六  泛型方法和通配符使用区别  


七  泛型参数命名约定:
E: element
T: Type
K: Key
V;Value

八  遗留代码 
  raw type :像Collection这样的泛型类型,不使用类型参数(type paramter)被称为raw type 
遗留代码API操作集合未使用泛型,新代码调用的集合可以使用泛型参数。  遗留代码修改 支持泛型 修改过后的API二进制兼容老的客户端

九  未检查警告(unchecked warning):


十  上边界  下边界(lower bound)
  下边界通配符  ? super T 

   上边界通配符 ? extend T

十一  上下边界泛型使用区别
In general, if you have an API that only uses a type parameter T as 
an argument, its uses should take advantage of lower bounded wildcards (? 
super T). Conversely, if the API only returns T, 
you'll give your clients more flexibility by using upper bounded wildcards 
(? extends T).

十二  通配符捕获(wildcard Capture)


十三 Multiple bounds 多边界
   

十四  协变(convariant)  逆变(contravariant)  可变(variance)  不变(invariant)


2 协变(convariant):String是Object的子类,如果List<String>是List<Object>的子类 则称为协变
3 逆变(contravariant):String是Object的子类,如果List<String>是List<Object>的父类 则称为逆变
4 可变(variance):如果带类型参数的类型支持协变或逆变,这称为可变
5 不变(invariant):即不支持协变也不支持逆变,则称为不变

十五  通配符类型(Wildcard types):如果类型参数未知,使用?表示,比如List<?> list = new ArrayList<>(); 由于List的泛型参数E具体类型未知,不能像list写入任何对象。
list.add("ONE")  提示The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (String)


十六  类型擦除(Erasure):支持泛型的类或方法,泛型信息只在编译阶段起作用,运行时泛型的类型信息已经被擦除,
比如list 在运行时不能感知到底是List<String> 还是List<Object>

十七  PECS原则(producer-extends, comsumer-super)
  指导如何使用上边界和下边界原则

十八  递归类型

  比如Integer类的,Integer extends Number implements Comparable<Integer>

十九  类型推导(type inference)

  从java7开始,编译器可以自动推到泛型类型参数比如

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

  可以将HashMap后面的泛型参数省略,只用<>

Map<String, List<String>> myMap = new HashMap<>(); 

分享到:
评论

相关推荐

    Java泛型:概念、用法与优势

    在本文中,我们简要介绍了Java泛型的概念,并通过实例和代码详细解释了泛型的用法。我们通过一个泛型类存储不同类型的数据,使用泛型方法打印任意类型的数据,并通过通配符方法比较两个Box内的数据是否相等。 综上...

    Java泛型单元试题.html

    精选java关于泛型的原理,应用和面试题,包含所有泛型考点。例如,泛型的概念,类型,实例化,容易混淆的用法。每一道题附上答案,方便理解考试要点。

    java泛型和反射机制

    对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握

    浅谈java泛型的作用及其基本概念

    下面小编就为大家带来一篇浅谈java泛型的作用及其基本概念。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java 基础泛型.pdf

    Java泛型概念 Java泛型是一种在编译时进行类型检查和类型推断的机制,它可以让我们编写更加通用、可重用的代码,提高了代码的可读性和可维护性,同时保证了类型安全。 Java泛型的核心思想是类型参数化,即在类、接口...

    java深度历险

    JAVA泛型 28 类型擦除 28 实例分析 29 通配符与上下界 30 类型系统 31 开发自己的泛型类 32 最佳实践 32 参考资料 33 目录 3 JAVA注解 34 使用注解 34 开发注解 35 处理注解 35 实例分析 38 参考资料 39 JAVA反射与...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    学习和理解Java泛型的基本概念和语法; 实际项目中需要使用泛型来增加类型安全性和重用性的开发任务。 目标: 本代码资源的目标是帮助读者理解泛型的用法和优势,并通过实际的示例代码加深对泛型的掌握。读者可以...

    Java泛型的概念、定义与运行方法分析

    主要介绍了Java泛型的概念、定义与运行方法,结合实例形式分析了java泛型的基本概念、定义与IDEA、命令行两种运行方法,需要的朋友可以参考下

    你真的懂Java泛型吗?

    但其实Java泛型还是有挺多tricky的东西的,编译器在背后为我们做了很多事。下面我们来看看有关Java泛型容易忽视的点。  泛型不支持协变  什么是协变?举个例子。  class Fruit{}  class Apple extends Fruit...

    Java泛型定义与用法实例详解

    主要介绍了Java泛型定义与用法,结合实例形式较为详细的分析了Java中泛型的概念、原理、定义、使用方法及相关操作注意事项,需要的朋友可以参考下

    Java1.5泛型指南中文版

    介绍java1.5泛型的书,本书详细的介绍了泛型的概念,以及在实际中的应用

    Java定义泛型接口和类的方法实例分析

    主要介绍了Java定义泛型接口和类的方法,结合实例形式分析了泛型相关概念、原理及泛型接口与类的定义实现方法,需要的朋友可以参考下

    使用泛型的方法.java

    泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其...泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

    Java面试题合集最新版2024.zip

    泛型:理解泛型的概念及其在Java中的应用,如泛型类和泛型方法。 并发编程:了解Java中的线程、同步、锁等机制,以及Java并发包中的工具类。 JVM与性能调优:对Java虚拟机(JVM)有一定了解,包括内存管理、垃圾回收...

    Java相关思维导图.zip

    1、java简介 ...27、java泛型 28、java序列化 29、java网络编程 30、java多线程 31、java8新特性 附加: linux命令 数据结构与算法分析 SQL语言 文以xmind结尾,软件下载地址:https://xmind.cn/download/

    泛型的通配符.java

    泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其...泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

    学习Java第二十四天–集合框架之泛型集合

    泛型集合12.3.4 泛型集合泛型的场景:定义泛型:12.3.5 Colletions工具类 12.3.4 泛型集合 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致; 特点: 编译时即可检查,而非运行时抛出异常; 访问时,...

    Java中高级核心知识全面解析(精华必看)

    一、Java (一). 基础 1.Java 基本功 1.1.Java 入门(基础概念与常识) 1.1.1.Java 语言有哪些特点? 1.1.2.关于 JVM JDK 和 JRE 最详细通俗的...1.2.7.Java泛型了解么?什么是类型擦除?介绍一下常用的通配符? ......

    Java高级之—泛型的使用

    一、泛型的概念 1.什么是泛型,看表面的意思,泛型就是指广泛的、普通的类型 2. 所谓泛型,就允许在定义类、接口时通过圆滚滚标识表示类中的某个属性的类型或者某个方法的返回值及参数类型。 这个参数类型将在使用的...

    实验七:Java集合与泛型

    本次实验掌握了集合的概念、体系结构、分类及使用场景,了解了Set接口及主要实现类(HashSet、TreeSet),了解了解List接口及主要实现类(ArrayList、LinkedList、Vector),掌握ArrayList的使用及其与Vector的区别,...

Global site tag (gtag.js) - Google Analytics