泛型

java 泛型详解

◇◆丶佛笑我妖孽 提交于 2020-01-13 18:30:37
https://blog.csdn.net/s10461/article/details/53941091 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 2. 一个栗子一个被举了无数次的例子: List arrayList = new ArrayList();arrayList.add("aaaa");arrayList.add(100); for(int i = 0; i< arrayList.size();i

RxJava系列之泛型高级

一曲冷凌霜 提交于 2020-01-13 04:39:34
系列文章 RxJava系列之简介和观察者设计模式 RxJava系列之上游与下游 RxJava系列之常用创建型操作符 RxJava系列之常用变换操作符 RxJava系列之常用过滤操作符 RxJava系列之常用条件操作符 RxJava系列之常用合并操作符 RxJava系列之常用异常操作符 RxJava系列之线程切换实战 RxJava系列之背压模式 RxJava系列之配合Retrofit RxJava系列之泛型高级 RxJava系列之手写create操作符 RxJava系列之手写create操作符增加泛型限定 RxJava系列之手写just操作符 RxJava系列之手写map操作符 RxJava系列之手写切换线程 因为RxJava中大量使用了泛型,而且使用了高级特性,所以这里学习一下。 泛型简单使用 List<String> list = new ArrayList(); list.add("A"); // list.add(6); // 编译期 就可以看到错误 String s = list.get(0);// 变量自动是String类型 上限和下限 继承关系,学生继承人,工人继承人,工人学生继承学生。 // todo 人类 public class Person { } // 学生 所属人类 public class Student extends Person { } // 工人

Java 中的泛型

北慕城南 提交于 2020-01-13 01:56:02
泛型的概念 泛型:   泛型是一种末知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型   泛型也可以看成是一个变量用来接收数据类型   E e:Element元素   T t:Type类型 是否使用泛型的对比 不使用泛型 /** * 创建集合对象,不使用泛型 * 好处: * 集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据。 * 弊端: * 不安全,会引发异常 */ 好处(举例): public class Demo01Generic { public static void main(String[] args) { // 集合不使用泛型 ArrayList arrayList = new ArrayList(); // 向集合中添加数据,用于测试,这里添加了String类型的数据,和int类型的数据 arrayList.add("ABC"); arrayList.add(123); // 使用迭代器遍历集合 // 第一步:获取送代器的实现类对象,并使用Iterator接口接收 Iterator ite = arrayList.iterator(); // 第二步:使用hasNext方法和next方法遍历集合,取出的元素的类型默认是Object类型 while (ite.hasNext()) { System.out.println( ite

java基础-泛型的优点

早过忘川 提交于 2020-01-13 00:00:26
1、性能   对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。装箱和拆箱的操作很容易实现,但是性能损失较大。假如使用泛型,就可以避免装箱和拆箱操作。 1 ArrayList list=new ArrayList(); 2 list.Add(20); //装箱,list存放的是object类型元素,须将值类型转化为引用类型 3 int i=(int)list[0]; //拆箱,list[0]的类型是object,要赋值就得把引用类型转化为值类型   如果换成泛型编程,就不会有装箱和拆箱的性能损失。 1 List<T> list=new List<int>(); 2 list.Add(20); //因为指定了用int来实例化,因此不必装箱 3 int i=list[0]; //同样地,访问时也不需要拆箱 2、类型安全   与ArrayList类一样,如果使用对象,可以在这个集合中添加任意类型。 如果使用非泛型编程,如下代码,就有可能在某些情况下会发生异常。 1 ArrayList list=new ArrayList(); 2 list.Add(20); 3 list.Add("string"); 4 list.Add(new MyClass()); 5 6 foreach(int i in list) 7 { 8 Console

编写高质量代码改善C#程序的157个建议[协变和逆变]

こ雲淡風輕ζ 提交于 2020-01-12 04:55:55
前言 本文已更新至 http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:   建议42、使用泛型参数兼容泛型接口的不可变性   建议43、让接口中的泛型参数支持协变   建议44、理解委托中的协变   建议45、为泛型类型参数指定协变 建议42、使用泛型参数兼容泛型接口的不可变性 让返回值类型返回比声明的类型派生程度更大的类型,就是“协变”。协变不是一种新出现的技术,在以往的编码中,我们已经在不自觉地使用协变。以下的代码就是一个不自觉应用协变的例子: class Employee { public string Name { get; set; } } class Programmer : Employee { } class Program { public Employee GetAEmployee(string name) { Console.WriteLine("我是雇员:"+name); return new Programmer() { Name = name }; } static void Main(string[] args) { } } Programmer是Employee的子类,所以一个Programmer对象也就是一个Employee对象

JAVA泛型分析

雨燕双飞 提交于 2020-01-12 03:08:17
1.泛型简单分析 声明:本文是我对泛型的一些理解,主要的是分析,而不是具体应用,所以讲的并不是面面俱到,具体的实现和用法可以参考具体的API文档。 首先我们看一下下面这段代码 var list = new Array(); list.push(1); list.push("test") for(var m in list){ alert(list[m]+1); } 上面的JavaScript代码是将集合中的值都加上1后弹出,可以看到结果弹出2和弹出 hello1,JavaScript是弱类型语言,可以通过这种方式处理所有类型数据,但是我们再看一下下面这段代码: public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add("test"); for (int i=0; i<list.size(); i++){ System.out.println((int)list.get(i)+1); } } 上面代码是想将list集合中的int类型的值都加1后输出,但是list集合中存储的是Object的子类,所以当遇到String类型的数据进行加1后就会抛出java.lang.ClassCastException异常。Java 是强类型语言

TypeScript教程

▼魔方 西西 提交于 2020-01-11 08:39:32
因为工作中用TypeScript,抽个时间,先大致的介绍一些基本知识,完整的学习还是建议从官网教程出发,玩儿的愉快 JavaScript的通用浏览器支持和动态类型特性使其成为理想的通用Web语言。 但是,任何来自面向对象背景的开发人员都知道,随着应用程序变得越来越大, JavaScript的灵活性可能成为一种负担 。这就是微软创建TypeScript以帮助开发人员利用面向对象编程原理生成更好的JavaScript 的原因。 在本文中,我们将详细介绍TypeScript的内容,并向您展示如何开始使用它。 什么是TypeScript? TypeScript的好处 第1部分)安装和设置 第2部分)编译为JavaScript 第3部分)静态打字 第4部分)数组 第5部分)接口 第6部分)课程 第7部分)泛型 第8部分)模块和命名空间 第9部分)第三方声明文件 什么是TypeScript? TypeScript就是所谓的JavaScript超集 。它不是JavaScript的替代品,也不会为JavaScript代码添加任何新功能。相反,TypeScript允许程序员在其代码中 使用面向对象的构造,然后将其转换为JavaScript。 它还包括类型安全和编译时类型检查等便利功能。最重要的是,它是完全 免费和开源的。 TypeScript 2.3是截至2017年中期的该语言的最新版本

C++知识点(十)泛型程序设计与C++STL标准模板库

十年热恋 提交于 2020-01-11 08:34:15
1.泛型程序设计 把代码从特定的数据结构中分离出来,使得它不依赖于特定的数据结构而更加通用 容器->迭代器->算法 适配器 2.概念:用于界定具备一定功能的数据类型 comparable:可比较 Assignable:可赋值 Sortable:可比较且可赋值 3.模型:符合一个概念的数据类型就是该概念的模型 e.g. int 为comparable概念的模型 4.用概念做模板参数名 5.STL:standard template library 容器、迭代器、函数对象、算法 容器<->迭代器(作为算法的参数)->算法 ->函数对象(作为算法的参数) 容器:头文件<vector>     顺序     有序关联     无序关联 容器适配器:栈stack 队列queue 优先队列priority_queue 迭代器:泛型指针,包含头文件<iterator> ++,*,->,-- 函数对象:泛化的函数 ,头文件<functional> 算法:头文件<algorithm> transform 6.迭代器:泛型指针 输入流迭代器 istream_iterator <T> (cin) *(p++) 输出流迭代器 ostream_iterator <T> (cout,“输出间隔”) *(p++)=x 前向迭代器:输入&输出迭代器,且可单向遍历 双向迭代器:输入&输出迭代器,且可双向遍历

CLR via C# 泛型 委托和接口的逆变和协变泛型类型参数

…衆ロ難τιáo~ 提交于 2020-01-11 07:16:38
委托的每个泛型类型参数都可以标记为协变量或逆变量。(协变性指定返回类型的兼容性,而逆变性指定参数的兼容性)利用这个功能,可将泛型委托类型的变量转换为相同的委托类型(但泛型参数类型不同)。泛型类型参数可以是以下任何一种形式。 1.不变量(invariant) 意味着泛型类型参数不能改变。 2.逆变量(contravariant)意味着泛型类型参数可以从一个类更改为它的某个派生类。在C#是用in关键字标记逆变量形式的泛型参数。逆变量泛型类型参数只出现在输入位置,比如作为方法的参数。 3.协变量(covariant)意味着泛型类型参数可以从一个类更改为它的某个基类。C#是用out关键字标记协变量形式的泛型类型参数。协变量泛型类型参数只能出现在输出位置,比如作为方法的返回类型。 例如: 其中,泛型类型参数T用in关键字标记,这使它成为逆变量;泛型类型参数TResult用out关键字标记,这使它成为协变量。 所以,像下面这样: fn1变量引用一个方法,获取一个object,返回一个ArgumentException。而fn2变量引用另一个方法,获取一个string返回一个Exception。由于可将一个string传给期待object的方法(因为string从object派生),而且由于可以获取返回ArgumentException的一个方法的结果,并将这个结果当成一个Exception

从零开始的java学习Day11----------基础篇(Java中的双列集合、泛型、可变类型)

孤者浪人 提交于 2020-01-11 05:34:54
Map集合 Collection中的集合称为单列集合,Map中的集合称为双列集合 Map中的集合,元素是成对存在的(理解为夫妻)。 每个元素由键与值两部分组成,通过键可以找到所对应的值。 注意:Map中的集合中键不可以重复,但值可以重复;每个键只能对应一个值。(如果添加元素时,键重复了,就会覆盖之前的键值对) Map常用子类 HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 注意 :这里的重写是指自定义类的,系统自带的例如:String,Integer就不需要重写 Map接口中的常用方法 put ( K key , V value ) : 把指定的键与指定的值添加到Map集合中,如果添加的时候,键相同,则覆盖相同键的键值对 remove ( Object key ) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 get ( Object key ) 根据指定的键