泛型

看源码时,关于泛型知识回顾

对着背影说爱祢 提交于 2020-01-11 04:41:19
使用泛型绝不是因为要使参数可以传入任意类型,如果仅仅是这样,直接用Object就可以了。用泛型是因为可以使该方法的返回值成为一个指定类型的集合,这样再次使用该集合的时候就有一个明确的类型了,这使的在将来该类型发生改变的时候编译器会报错,提醒你做相应的修改,而不是让问题暴露在运行阶段。这是泛型的重要作用之一 看线程池源码时,泛型部分 第一个T 第一个T是用来指定后两个T的类型,即参数类型与返回集合元素类型同为类型T 来源: https://www.cnblogs.com/HHHzhihao/p/10927710.html

Action和Func带泛型的使用

岁酱吖の 提交于 2020-01-10 14:33:30
泛型 的存在是为了避免类型膨胀 和 成员膨胀 先是类膨胀 创建 苹果类 和 书类 苹果类包含属性为 颜色 书类包含属性为 书名 class Apple { public string Color { get ; set ; } } class Book { public string Name { get ; set ; } } 货物 都要用 盒子进行包装 若不同的盒子都装载不同的货物 那么 若有 苹果 书 南瓜 可乐 等货物 就需要有 这么多 类的盒子 太夸张了 肯定不行 这就要一个 泛型 泛型创建后 在使用时 只需要在类后添加类型 系统便会自动推断出来 格式 创建 box类 //使用<T>使类 Box泛型化 class Box < TCargo > { public TCargo cargo { get ; set ; } } //调用泛型类 //初始化一个Apple类 命名为 redapple Apple redapple = new Apple ( ) { Color = "red" } ; //调用泛型类 Box < Apple > applebox = new Box < Apple > ( ) { cargo = redapple } ; Console . WriteLine ( applebox . cargo . Color ) ; 这就是

泛型学习.

两盒软妹~` 提交于 2020-01-10 09:08:00
泛类学习 一.应用场景 1.效率. 2.易用,容错. 3.处理同一类事情. 二.应用. 1.无论在声明变量还是实例变量都要指定使用那个变量代替<T> 2.内部算法和数据操作保持不变 三.使用. 1.编译器不知道使用将要指定的具体类型 2.派生约束.,以逗号分割多个约束. 为使用的一般类型参数分别指定约束.以空格分割. 基类约束(最多一个). 可以同时约束一个基类以及一个或多个接口,但是该基类必须首先出现在派生约束列表中 代码 public class LinkedList where K : IComparable,IConvertible //多个约束以逗号分割 public class LinkedList where K : IComparable where T : ICloneable public class MyBaseClass {...} public class LinkedList where K : MyBaseClass public class LinkedList where K : MyBaseClass, IComparable 3 .构造函数约束 class Node where T : new () { public K Key; public T Item; public Node NextNode; public Node() { Key

Java_集合与泛型

人走茶凉 提交于 2020-01-10 00:31:43
Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据。 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的。集合的长度是可变的。 集合中存储的元素必须是引用类型数据 集合的继承关系图 a:ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口。Collection接口为最顶层集合接口了。 源代码: interface List extends Collection { } public class ArrayList extends AbstractList implements List{ } b:集合继承体系 这说明我们在使用ArrayList类时,该类已经把所有抽象方法进行了重写。那么,实现Collection接口的所有子类都会进行方法重写。 Collecton接口常用的子接口有:List接口、Set接口 List接口常用的子类有:ArrayList类、LinkedList类 Set接口常用的子类有:HashSet类、LinkedHashSet类 可以看下图了解继承关系 集合Collection的方法

EffectiveC++ 第7章 模板与泛型编程

拥有回忆 提交于 2020-01-09 21:08:00
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的“可能比较准确”的「翻译」。 Chapter 7 模版与泛型编程 Templates and Generic Programming 本章无法使你成为一个专家级的template程序员,但可以使你成为一个比较好的template程序员。本章也会给你必要信息,使你能够扩展你的template编程,到达你所渴望的境界。 条款41 : 了解隐式接口和编译器多态 在oop的世界里,我们总是以显式接口(explicit interfaces)和运行期多态(runtime polymorphism)解决问题。举个例子,给定这样(没啥意义)的class: class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& other); //见条款25 ... }; 和这样的函数(也没啥意义): void doProcessing(Widget& w) { if(w.size()>10 && w != someNastyWidget){ Widget temp(w); temp.normalize(); temp.swap(w);

java泛型中的各种限制

一个人想着一个人 提交于 2020-01-08 21:01:33
java和其他语言一样,都支持泛型,包括泛型类和泛型方法,但是java的泛型比较特殊。因为java的泛型并不是在java诞生之初就加入的,在很长的一段时间里,java是没有泛型的,在需要泛型的地方,统统都采用协变的方式,也就是采用Object,比如ArrayList类,元素的类型就是Object。为了兼容原来的代码,java的设计者希望在加入泛型之后,所有的泛型都可以传给原来的对应的非泛型参数,例如,可以把ArrayList<xxx>传给原来接收ArrayList参数的方法。为了达到这个目的,java的设计者采取了一种叫做“类型擦除”的实现方式,把泛型拦截在了编译阶段,在虚拟机中,所有的泛型参数最终的类型都会是转换后的Object类型(如果有类型限定,则是限定后的类型,如 <T extends Super>,则泛型T在虚拟机中统一都是Super类型),然后利用协变性而兼容所有类型或限定类型参数的传入,从而实现泛型。 比如用户定义泛型类: class Super<T,V>{ T a; public V mehod(T arv){ a=arv; return a; } } 在经过编译阶段的类型擦除之后,虚拟机看到的Super类是这样的: class Super{ Object a; public Object mehod(Object arv){ a=arv; return a; }

Java 泛型在实际开发中的应用

扶醉桌前 提交于 2020-01-08 09:25:04
  java泛型是对 Java 语言的类型 系统 的一种扩展,泛型的本质就是将所操作的数据类型参数化。下面我会由浅入深地介绍Java的泛型。 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add("hah"); //list.add(new Test()); // list.add(1); for (Object object : list) { String s1 = (String)object; //.....如果是你你该如何拿出list的值,如果list中放着上边的不同类型的东西。无解 } } }   编码的时候,不加泛型是可以的,但是 你从容器中拿出来的时候必须强制类型转换,第一是多敲很多代码,第二极容易发生类型转换错误,这个运行时异常 比如你把上边 注释的代码放开,程序在获取容器的地方就会报运行时异常 ClassCasrException Java语言的设计者引入了泛型,暂时先不追究它内在是怎么实现的。只需要知道,如果我们像下边这么写,我们就不需要强制类型转换。我们也不需要担心运行是异常了。 List<String> newList = new

Java 高级开发必修知识---反射

痞子三分冷 提交于 2020-01-08 08:04:26
程序猿们经常说的一句话:反射反射。。。程序员的快乐 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 文章开始之前 提一下: java反射操作其实就是主要围绕Class,Field,Methon,Constructor等几个类来操作其中的方法 Class类的使用 1) 在面向对象的世界里,万事万物皆对象 A. Java语言中,普通数据类型,静态成员不是对象,其他皆对象 B. 每一个类也是对象 C. 类是java.lang.Class类的实例对象 There is a class named Class 对象的表示: 普通类对象表示: Foo foo = new Foo(); Class类实例对象表示: //Foo也是一个实例对象,是Class类的实例对象 任何一个类都是Class的实例对象,这个实例对象有三种表达方式 1. 任何一个类都有一个隐含的静态成员变量class: Class c1 = Foo.class; 2. 已经指定该类的对象通过getClass方法 Foo foo = new Foo(); Class c2 = foo.getClass(); 官网:c1/c2 表示了Foo类的类类型(class type)

Java 高级开发必修知识---反射

巧了我就是萌 提交于 2020-01-08 05:28:23
z摘自: http://www.cnblogs.com/lsy131479/p/8798217.html 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 文章开始之前 提一下: java反射操作其实就是主要围绕Class,Field,Methon,Constructor等几个类来操作其中的方法 万物皆对象。但基本数据类型 和 使用static修饰的成员不是对象 但基本数据类型的封装类是对象 Class类的使用 1) 在面向对象的世界里,万事万物皆对象 A. Java语言中,普通数据类型,静态成员不是对象,其他皆对象 B. 每一个类也是对象 C. 类是java.lang.Class类的实例对象 There is a class named Class 对象的表示: 普通类对象表示: Foo foo = new Foo(); Class类实例对象表示: //Foo也是一个实例对象,是Class类的实例对象 任何一个类都是Class的实例对象,这个实例对象有三种表达方式 1. 任何一个类都有一个隐含的静态成员变量class: Class c1 = Foo.class; 2. 已经指定该类的对象通过getClass方法 Foo foo

C# 集合类

偶尔善良 提交于 2020-01-08 04:52:18
说起集合类,我们都不陌生,因为在项目中经常会用到。记得每次遇到要存储键值对时,都会想到HashTable,可以在用的过程中却不是很懂,不懂装懂,结果最后还是不会。今天中午正好有时间,就整理了一下相关的类,主要包括:列表、队列、位数组、哈希表和字典。 (一)ArrayList类:使用大小可按需动态增加的数组。 代码 class Program { static void Main(string[] args) { ArrayList al = new ArrayList(); al.Add(100);//单个添加 foreach (int number in new int[6] { 9, 3, 7, 2, 4, 8 }) { al.Add(number);//集体添加方法一 } int[] number2 = new int[2] { 11, 12 }; al.AddRange(number2);//集体添加方法二 al.Remove(3);//移除值为3的 al.RemoveAt(3);//移除第3个 ArrayList al2 = new ArrayList(al.GetRange(1, 3));//新ArrayList只取旧ArrayList一部份 Console.WriteLine("遍历方法一:"); foreach (int i in al)//不要强制转换 {