泛型

C# 特性复习-泛型

六月ゝ 毕业季﹏ 提交于 2020-03-09 08:04:06
泛型,.NET的这个特性相信大家都已经很熟悉了,提起泛型,不能不首先提到C++中的模板,C++中模板的引入大大提高了代码的重用性,因此也得到了许多程序员的喜爱。因此,在同为强类型语言平台的.NET 2.0和Java 1.5中,它们也都不约而同的引入了泛型的对语言和平台的支持。不过虽然三种语言最终都提供了将类型参数化的功能,然而这个功能在三个平台或语言中的实现却大大不同。相对来说,C++的模板功能是三者中最为强大的,不过由于.Net和Java对类型安全和稳定性要求更高,它们对泛型的支持要稍微简单,不过即使如此,二者对泛型特性的实现也引起了两个阵营中程序员们的争论,不过最终普遍认为Java的伪泛型(擦拭法)要比.NET的JIT级别的真正的泛型性能要差(java仍然有装箱,拆箱操作)。当然这些是后话,下面我们来看看.NET的泛型到底如何使用吧! 基本介绍 .NET 2.0以后以后支持在很多类型上使用泛型,包括类、结构、接口、委托和方法成员,在这些类型上使用泛型和在类上使用是一样的。它甚至支持同一个接口但不同泛型类型的实现,这有点类似重载在类级别的实现。最后.NET允许你同时定义多个泛型类型。 在泛型方法中的泛型类型基本跟在类中使用情况一样,不过泛型方法有一个方便程序员的地方就是它的类型推断功能,这意味着程序员可以即能和使用普通方法一样使用这些方法,同时又能享受泛型带来的方便。e.g.

[译]聊聊C#中的泛型的使用(新手勿入)

喜欢而已 提交于 2020-03-09 07:50:22
写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发现了一些问题,因此也进行了纠正,当然,原文的地址我放在最下面,如果你的英文水平比较好的话,可以直接直接阅读全文。同时最近建了一个.NET Core实战项目交流群637326624,有兴趣的朋友可以来相互交流。目前.NET Core实战项目之CMS的教程也已经更新了6篇了,目前两到三天更新一篇。 作者:依乐祝 原文地址: https://www.cnblogs.com/yilezhu/p/10029782.html 介绍 C#和.NET中的泛型程序具有强类型集合的许多优点,并为代码提供更高质量和性能提升。泛型是C#语言和公共语言运行库(CLR)中的一个新功能,它将类型参数的概念引入.NET Framework。类型参数使得设计某些类和方法成为可能,例如,通过使用泛型类型参数T,可以大大简化类型之间的强制转换或装箱操作的过程(装箱、拆箱问题)。说白了,泛型就是通过参数化类型来实现在同一份代码上操作多种数据类型,利用“参数化类型”将类型抽象化,从而实现灵活的复用。每个集合的详细规范可以在System.Collection.Generic名称空间下找到。 装箱和拆箱 .Net定义了两种主要的数据类型来表示变量

Java基础 -- 13 Map集合

烈酒焚心 提交于 2020-03-08 21:05:52
** Map集合** 定义: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map<K,V>接口。 java.util.Map<K,V>接口是最高接口,注意和Collection没有直接联系。 第一个泛型代表键是什么类型。 第二个泛型代表值是什么类型。 二者可以同类型,也可以不同类型。 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 Collection中的集合,元素是孤立存在的,Map中的集合,元素是成对存在的,每个元素由键与值两部分组成。因此Collection中的集合称为单列集合 ,Map中的集合称为双列集合,这两个接口没有任何关系 Map集合使用时是通过键去获取值,每个键只能对应一个值。需要注意的是,Map集合不能包含重复的键,但值可以重复。 Map常用子类 认识Map中常用的子类知道其各自特点 HashMap<K,V>: 快,键唯一,自定义键重写hashCode和equals 不能保证才存取顺序 LinkedHashMap<K,V>: 继承了HashMap的特点,但是有存取顺序 HashMap<K,V>:存储数据采用的哈希表结构

Java 数组

天涯浪子 提交于 2020-03-08 15:50:03
目录 数组的定义 数组的初始化 数组对象 多维数组 数组的特殊性 数组与泛型 1.数组的定义 数组只是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本数据类型数据序列。 数组是通过方括号下标操作符来定义和使用的。 定义一个数组有两种格式: //第一种 int[] a; //第二种 int a[]; 2.数组的初始化 数组定义完成后,此时拥有的只是对数组的一个引用,并没有给数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须写初始化表达式。对于数组,初始化动作可以出现在代码的任何地方,但是有一种特殊初始化表达式除外。 数组有三种初始化表达式: //第一种 int[] arr1 = {1,2,3}; //第二种 int[] arr3 = new int[3]; Integer[] arr2 = new Integer[3]; //第三种 int[] arr4 = new int[]{5,6,7,};//最后一个逗号是可选的(这个特性使维护长列表变得更容易?) Integer[] arr5 = new Integer[]{new Integer(12),new Integer(23),new Integer(34)}; 第一种是由一对花括号括起来的值组成,它必须在创建数组的地方出现。此种情况,存储空间的分配将由编译器负责,等价于使用new。

Java.泛型、匿名内部类和集合

≡放荡痞女 提交于 2020-03-08 05:47:08
泛型 什么是泛型,为什么引入泛型 这里考虑到方法代码的复用 不单单是对于功能模块的要求封装。同时需要对数据类型进行统一的约束!!! 根据用户的要求对应数据类型。 Java的泛型就是来解决对应的问题 格式: <自定义泛型无意义大写英文字母占位符> <T> <E> <K> <V> 泛型可以在方法中使用 泛型可以在类中使用 泛型可以在接口中使用 泛型可以在方法中使用 使用静态方法举例说明泛型在方法中的使用格式 格式 : public static < T > 返回值类型 [ 自定义泛型 ] 方法名 ( 必须存在一个对应泛型的参数 ) { //方法体内可以使用自定义泛型 } 使用注意事项: 自定义泛型声明在返回值之前,已保证方法的参数和返回值都可以使用对应的泛型 方法声明的泛型,在方法的参数中必须有一个参数是对应声明的自定义泛型。当前参数是用于约束方法内所有使用到泛型的位置对应的具体数据类型是什么。 import java . util . Arrays ; public class Demo1 { public static void main ( String [ ] args ) { /* * test方法使用了自定义泛型,传入的实际参数是什么类型 * 泛型T对应的具体数据类型是什么类型 */ Integer test = test ( 123 ) ; String test2 =

Java语言程序设计-第10版notes

半城伤御伤魂 提交于 2020-03-07 16:59:59
第1章 计算机、程序和Java概述 部分章节小结 1、编程错误可以分为三类:语法错误、运行时错误和逻辑错误。编译器报告的错误称为语法错误或者编译错误;运行时错误指引起程序非正常结束的错误;而当一个程序没有按照预期的方式执行时,产生逻辑错误 。 第2章 基本程序设计 部分章节小结 1、拓宽类型不需要显式转换,缩窄类型必须显式完成。 123456 int i=9;double d=i;//缩窄类型转换double d=9.0;int i=(int)d; 2、计算机科学中,1970年1月1日午夜零点为UNIX时间戳。 第3章 选择 部分章节小结 1、除开赋值操作符的所有二元操作符都是左结合的,赋值操作符是右结合的。(此处的结合指的是结合律) 123456 //以下两个表达等价a-b+c-d((a-b)+c)-d//以下两个表达等价a=b+=c=5a=(b+=(c=5)) 第4章 数学函数、字符和字符串 部分章节小结 1、字符 ‘ ‘ 、t、 f、 r 和 n 都称为空白字符。 2、字符可以基于它们的Unicode码使用关系操作符进行比较。 第6章 方法 部分章节小结 1、程序模块化和可重用性是软件工程的中心目标之一。 2、方法可以重载,这意味着两个方法可以拥有相同的方法名,只要它们的参数列表不同即可。 3、方法抽象是把方法的应用和实现分离,用户可以在不知道方法是如何实现的情况下使用方法

泛型的三种形式

≡放荡痞女 提交于 2020-03-06 16:07:23
以下内容都是理论加实验得来的,如有错误,烦请评论区纠正谢谢 。 说到泛型大家基本都知道< T >这个符号,类似的< E > < K >等等就不去谈了,其实用起来都一样的,那么这个< T >是用来干嘛的,其实啊这是泛型三种形式的声明标识。 三种形式分别是 :泛型类,泛型接口,泛型方法,目前就这三种别扯别的了。 泛型类 在类名的后面加上< T >这就是泛型类了,这是最简单的泛型类 < T > 和 T 区别 < T >是泛型三种形式的声明标志,T 代表的是引用类型,具体T代表的是哪个引用类型由两种途径决定, 第一种是在泛型(类实例化/接口被实现)时给< T >中的 T 替换成具体的引用类型,这样实例化对象的(属性类型/方法中的参数类型)就和之前替换的类型一致,如果(赋值/传参)的引用类型不一致就会报错。还有一种后面讲 泛型类中的方法和泛型方法的区别 他们的区别在于有没有< T >,泛型类中的方法前面已经有了,在第二,三张图中getdata方法就是,再来看看泛型方法 这里的getdata才是泛型方法 现在看T获取的引用类型的第二中表示 就是赋值,或者传参,a属性赋值一个Integer类型的值,方法中的o参数我们传入String类型的值,再用getClass方法获取他们的类模板,看运行结果 还有一个泛型接口就不说了,和类差不多,自己去悟,这些内容没有点出泛型存在意义

C#的变迁史05 - C# 4.0篇

帅比萌擦擦* 提交于 2020-03-06 11:04:09
C# 4.0 (.NET 4.0, VS2010)   第四代C#借鉴了动态语言的特性,搞出了动态语言运行时,真的是全面向“高大上”靠齐啊。 1. DLR动态语言运行时   C#作为静态语言,它需要编译以后运行,在编译的过程中,编译器要检查语法的正确性和类型的安全性,这是一个静态查找(编译时查找)的过程。确实,在运行之前发现问题总比在运行时发型问题要好的多,早发现早治疗嘛!但是这样做有时候会带来一些麻烦,比如类型在编译时无法获得时。   看网上经典的一个例子:动态计算器。   假设有一个计算器,它所在的程序集是动态加载进来的;当我们需要使用这个计算器计算数据时,通常是使用反射的方式: object calc = GetCalculator(); Type calcType = calc.GetType(); object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); int sum = Convert.ToInt32(res);   不错,很好,可是有点麻烦。   还有一种情况出现在Office程序中,例如给某单元格赋值: ((Excel.Range)excel.Cells[1, 1]).Value2= "Hello";  

泛型

馋奶兔 提交于 2020-03-06 08:22:07
01_泛型的概念 ========================================================================================================================= 02_使用泛型的好处 Demo01Generic.java package com.itheima.demo03.Generic; import java.util.ArrayList; import java.util.Iterator; public class Demo01Generic { public static void main(String[] args) { show02(); } /* 创建集合对象,使用泛型 好处: 1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型 2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错) 弊端: 泛型是什么类型,只能存储什么类型的数据 */ private static void show02() { ArrayList<String> list = new ArrayList<>(); list.add("abc"); //list.add(1); //add(java.lang.String)in ArrayList

Java基础之泛型

◇◆丶佛笑我妖孽 提交于 2020-03-06 06:51:27
一、泛型的理解与简单使用 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。 1.1、泛型在接口上的使用: package com.luo.test; public interface TestInterface<T> { String objectToString(T o); } 对应实现类可以这样: package com.luo.test; public class TestInterfaceImpl<T> implements TestInterface<T> { public String objectToString(T o) { return o.toString(); } public static