美文网首页
Java泛型深度解析

Java泛型深度解析

作者: 特仑苏纯牛乳 | 来源:发表于2019-11-28 08:56 被阅读0次

1.无界通配速

无界通配符 Set<?>可以容纳任何类型的元素,而原始类型Set也可以容纳任何类型的元素。那它们之间有什么区别呢?
关于Set<?>有两个事实:
Item 1:?代表任何类型。Set<?> 可以容纳任何类型的元素。
Item 2:因为我们不知道?的类型,所以不能将任何元素放入Set<?>。
由于 Set<?> 可以容纳任何类型的元素,因此我们仅在循环中使用Object。
因为我们不完全知道 <?> 的类型,所以除了null之外,我们无法添加其他任何内容。出于相同的原因,我们无法使用 Set<?> 初始化集合。
因为原始类型没有限制。但是,这很容易破坏集合的不变性。
简而言之,通配符类型是安全的,而原始类型则不是。我们不能将任何元素放入Set<?>中。
如果要使用泛型类型,但不知道或不在乎该参数的实际类型,则可以使用<?> 。它只能使用方法的参数。

2.列表与数组

image.png

数组是协变的(covariant)(若Sub是Super的子类型,Sub[]也是Super[]的子类型),是不安全的。

3.有限制的通配符

为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符类型。如果某个输入参数既是生产者,也是消费者,那么通配符就没有什么好处了:因为需要的是严格的类型匹配。

需要注意的是JVM规范对参数化的类型也做了相应的修改,引入了Signature的重要属性,所谓的类型擦除只是Code属性中的字节码进行了擦除,实际上元数据中仍然保存了泛型信息,这是我们能通过反射手段获取参数化类型的根本依据。

参考:《effective java》

写的不好 大家直接看这篇吧:
https://www.cnblogs.com/en-heng/p/5041124.html

相关文章

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • Java泛型深度解析

    1.无界通配速 无界通配符 Set可以容纳任何类型的元素,而原始类型Set也可以容纳任何类型的元素。那它们之...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • java 泛型解析

    Java 泛型 1、泛型的精髓是什么 2、泛型方法如何使用 概述: 泛型在java中具有重要地位,在面向对象编程模...

  • Java泛型解析

    4、有界泛型 :是指 “ 上界通配符 (Upper Bounds Wildcards) ...

  • java泛型解析

    为什么需要泛型?如果我们写的程序, 都用固定类型的话,那么当类型需要发生变化的时候,我们很难去做扩容。 比如,一个...

  • JDK1.7 ConcurrentHashMap

    详细的解释 ↓漫画:什么是ConcurrentHashMap?Java泛型底层源码解析--ConcurrentHa...

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

网友评论

      本文标题:Java泛型深度解析

      本文链接:https://www.haomeiwen.com/subject/tlqpwctx.html