代码先锋网 代码片段及技术文章聚合

Java深入理解之泛型

技术标签: java

1.Java中的泛型是什么?使用泛型的好处

在集合中存储对象并在使用前进行类型转换不方便,泛型为了防止这种情况发生,它提供了编译期的类型安全,确保你只要把正确类型的对象放入集合中,避免了在运行时出现ClassCastException

2.Java的泛型是如何工作的?什么是类型擦除?

泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息,例如List<String>在运行时仅用一个List来表示。这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。

3.什么是泛型中的限定通配符和非限定通配符?

限定通配符对类型进行了限制。有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面<?>表示了非限定通配符,因为<?>可以用任意类型来替代。更多信息请参阅我的文章泛型中限定通配符和非限定通配符之间的区别。

4. List<? extends T>和List <? super T>之间有什么区别 ?

这两个List的声明都是限定通配符的例子,List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。例如List<? extends Number>可以接受List<Integer>或List<Float>。

5. 如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

   public V put(K key, V value) {

         return cache.put(key, value);

   }

6可以把List<String>传递给一个接受List<Object>参数的方法吗?

不可以,因为List<Object>可以存储任何类型的对象包括String, Integer等等,而List<String>却只能用来存储Strings。

List<Object> objectList;
List<String> stringList;
objectList = stringList;  //compilation error incompatible types

7.  Array中可以用泛型吗?

Array事实上并不支持泛型(List可以提供编译期的类型安全保证,而Array却不能。)

 

 

 

 

 

 

 

 

版权声明:本文为w_x_s_h_h原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w_x_s_h_h/article/details/86489085

智能推荐

【Java进阶】 泛型深入理解

泛型之前 在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性。此外,如果将方法参数声明为接口,将会更加灵活。 在Java增加泛型类型之前,通用程序的设计就是利用继承实现的,例如,ArrayList类只维护一个Object引用的数组,Object为所有类基类。 [java] view p...

Java泛型深入理解

第一个出现的<T>,是定义声明一个范型名为T,当然可以为任何一个或多个字母,告诉编译器需要某个类型作为一个占位符,比如T。 后两个T都是在使用范型,前一个代表返回T类型变量;后一个是只接受Class<T>类型变量的可变参数。 号外:List<?>和List<T>的区别 List<T>和List<?>的区别,这问的有点含糊。我想...

深入理解java的泛型

文章目录 简介 泛型和协变 泛型在使用中会遇到的问题 类型擦除要注意的事项 总结 简介 泛型是JDK 5引入的概念,泛型的引入主要是为了保证java中类型的安全性,有点像C++中的模板。 但是Java为了保证向下兼容性,它的泛型全部都是在编译期间实现的。编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种就叫做类型擦除。编译器在编译的过程中执行类型检查来保证类型安全,但是在随后的字节码...

java 深入理解泛型

泛型相信很多人都遇到过,比如使用集合的时候类似List,封装适配器的时候。泛型在处理数据的时候可以帮助我们,只处理指定类型的数据,比如集合无论我们存什么样的数据,取出的时候都会被认为是Object的对象,一般都需要我们去强转为想要的数据类型,这个时候可能会出现类型转换错误。比如: 这样在执行的时候就会出现Integer cannot be cast to String 如果我们指定了泛型,如下 我...

Java 泛型深入理解。

泛型 什么是泛型:也许有会说是广泛的参数类型,但是泛型的本质其实是:参数化类型。泛型的特点是泛,经常用于一些传入的参数,或者是存储参数不确定的场景。 泛型的前身 泛型是java1.5之后出现的内容。在泛型出现之前,我们很多时候都是利用强制转换来实现泛型的。这样虽然在功能层面上会满足需求。但是又一个巨大的安全问题就是类型安全。因为没有泛型的时候,你写的类型转换它不会帮你去看的,如果这时候你把一个Ob...

猜你喜欢

java里程碑之泛型--深入理解泛型

所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法的时候动态的指定。JAVA5之后修改了集合中所有的接口和类,为这些接口和类都提供了泛型的支持。 关于泛型的底层,我们先来看看一段代码: 上面的代码new了2个list,然后判断这2个list的类是不是同一个?如果没有深入的了解过泛型,我们很容易以为上面的代码输出是false,但是运行上面的代码,实际输...

深入理解泛型

今天在写代码的时候,看见这样的一段代码,然后知道自己还没有把泛型吃透,就花了一点时间再研究研究,因为之前写代码的时候涉及到的泛型都是简单的泛型,比如一个List<String> 这样的,限定类型的,但是一个随着自己接触的越来越广,难免会用到复杂的泛型: 这个方法的作用大家应该很容易能够看明白,就是给一个Map按照Value进行排序,排序的规则,由Value的Comparable去定义的...

深入理解泛型

1.概述 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中, 操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 先看个简单的例子: 这个类通过构造来持有其他对象但是扩展性非常差,假如我们要想持有其他类型对象将会变得非常麻烦。当然我们可以接收一个Object的对...