学习笔记——泛型

泛型的意义:
泛型用来保证类型的统一,主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。
1.类型安全,通过设置泛型,可以让编译器验证类型
2.消除强制转换。如果不用泛型,将元素从容器中取出时,都是由object类型向目标类型强制转换。而由于泛型的擦除,所有的泛型类型变量都会被替换为原始类型,在获取的时候,集合会实现变量的强制转换,转换是隐式的。

  1. 泛型类:public class Test<T>
  2. 泛型接口:public interface Generator<T> {T next()}
    泛型可以用于接口,例如生成器Generator,是一种专门负责创建对象的类。
  3. 泛型方法:public <T> void test(T x)
    是否拥有泛型方法,与这个类是否泛型没有关系。

类型变量限定:
<T extends myClass>
<T super myClass>
无界通配符:<?>

泛型的擦除:
当你在使用泛型时,任何具体的类型信息都被擦除了。编译器在编译的时候去掉类型信息,生成不包含类型信息的java字节码。
泛型类型参数有限定的将擦除到它的第一个边界,无限定的变量会擦除到object。

泛型的局限:

  1. 基本类型无法作为类型参数,但是java具备自动基本类型包装功能。原因是类型擦除后,原始类型变为object,而object不能存储int等基础类型的值。
  2. 由于擦除,一个类不能实现同一个泛型接口的两种变体。
  3. 不能创建参数化类型的数组。如Pair<String>[] table = new Pair<String>[10];是错误的,因为擦除会将string信息抹去,所以只要是Pair类型的对象都可以被加入。
  4. 使用带有泛型类型参数的转型或instanceof不会有任何效果,也不能实例化类型变量。用反射调用class.newInstance()解决
  5. 在静态方法和静态变量中不能使用泛型。因为泛型中泛型参数的实例化是在定义对象时指定,而静态方法和变量可以不需要对象就可以调用。

原文地址:http://blog.51cto.com/13580976/2067231

时间: 2024-08-02 15:25:05

学习笔记——泛型的相关文章

swift学习笔记-&gt;泛型

如果学过java就知道泛型是什么  比如说定义一个数组  var a : [Int] Int 就是该数组的泛型 创建一个字典也是根据泛型储存内容的 var a : Dictionary <String,String> 而泛型能解决的问题  就像字典一样  他是个不确定的键值对  你定义什么类型就能存什么类型 泛型函数 下面举个例子一个函数  要将两个参数值互换 func myswap(inout a: Int,inout b: Int) { let temp = a a = b b = tem

C#学习笔记 ----泛型

泛型的优点和缺点: 性能 类型安全 二进制代码的重用 代码的扩展 命名约定(字母T作为前缀) 创建泛型类型,如下: public class LinkedListNode<T> { public LinkedListNode(T value) { this.Value = value; } public T Value{get;private set;} public LinkedListNode<T> Next{get;internal set;} public LinkedLi

Java学习笔记——泛型

如果T既要继承类又要指定接口,使用下面方式: public class some<T extends Iterable<T> & Comparable<T>>{} Java的泛型不具有共变性(如果B是A的子类,而Node<B>可视为一种Node<A>,则称Node具有共变性),不过可以使用类型通配字符?与extends来声明变量,使达到类似的共变性. Node<Apple> apple = new Node<>(n

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下

Java学习笔记_26_泛型概述

                                                               泛型概述 在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型.但向  下类型转换都 是存在潜在危险的,因此应该尽量避免它们.  Java的泛型: 所谓泛型就是在定义(类.方法.形参.成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型. 泛型为提高大型程序的类型安全和维护带来了很大的潜

C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用的迭代器类型.比方,假设形參必须为随机訪问迭代器则可提供vector或 deque类型的迭代器,或者提供指向数组的指针.而其它容器的迭代器不能用在这类算法上. C++还提供了另外两种算法模式:一种模式由算法所带的形參定义;还有一种模式则通过两种函数命名和重载的规范定义. 一.算法的形參模式 大多数的