泛型

浅谈 Swift 中的泛型

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-01 10:06:58
Objective-C 缺乏一个重要特性:不支持 泛型 。幸运地是, Swift 拥有这一特性。 泛型 允许你声明的函数、类以及结构体支持不同的数据类型。 提出问题 优秀的泛型使用案例中,最常见的例子当属对 栈(Stack) 的操作。栈作为容器有两种操作:一. 压入(Push) 操作添加项到容器中;二. 弹出(Pop) 操作将最近添加项从容器移除。首先我们用非泛型方式设计 栈 。最后代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class IntStack { // 采用数组作为容器保存数据 类型为Int private var stackItems:[ Int ] = [] // 入栈操作 即Push 添加最新数据到容器最顶部 func pushItem (item:Int) { stackItems.append(item) } // 出栈操作 即Pop 将容器最顶部数据移除 func popItem () -> Int ?{ let lastItem = stackItems.last stackItems.removeLast() return lastItem } } 该栈能够处理 Int 类型数据。这看起来不错,但是倘若要建立一个能够处理 String 类型的 栈 ,我们又该如何实现呢?我们需要替换所有 Int 为 String

List、Array与ArrayList

前提是你 提交于 2020-03-01 06:17:46
数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3]; //赋值 s[0]="a"; s[1]="b"; s[2]="c"; //修改 s[1]="b1"; 但是数组也存在一些不足的地方,比如在两个数据中插入数据,还有我们在声明数组时必须指明数组的长度,过长会是的内存浪费,过短又会造成数据溢出,C#中最先提供了ArrayList来解决这些缺点。 ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如: ArrayList list = new ArrayList(); //新增数据 list.Add("abc"); list.Add(123); //修改数据 list[2] = 345; //移除数据 list.RemoveAt(0); //插入数据 list.Insert(0, "hello world"); 从上面实例看,ArrayList好像是解决了所有的缺点,那么它就应该是完美的了,为什么C#2

[每日短篇] 25

孤街醉人 提交于 2020-03-01 03:25:12
问题 日常在写 Java 代码时对警告 Type safety: Unchecked cast from XXX to YYY 一定不会陌生,例如 Type safety: Unchecked cast from Object to Map<String,String> 。如果仔细观察的话,可以注意到, YYY 从来不会是一个非泛型的类型。 原因 产生这个警告的原因是在强制类型转换时目标类型是一个非无边界通配符的泛型类型,而 Java 的半残泛型又无法在运行时判断一个泛型类型是否匹配目标类型。举个例子来说就是: Object source = Collections.singletonMap("a", 2); // #1 var target = (Map<String, String>) source; // #2 var value = target.get("a"); // #3 对于上面的代码,无法在 #2 行代码执行时就确认 target 是一个完全通过类型检查的值,当 #3 行代码执行时,还是会产生 java.lang.ClassCastException 异常;而从直觉上,如果 #2 行没有编译期错误或者运行时 java.lang.ClassCastException 异常,那 target 就是 Map<String, String> 类型的。在这个矛盾之下,在

详解 泛型 与 自动拆装箱

旧街凉风 提交于 2020-02-29 21:38:50
目录 泛型: 自动拆装箱: 泛型: 首先,本人来介绍一下 什么是泛型 : 泛型概述 : 是一种把类型明确的工作 推迟到创建对象 或者 调用方法的时候 才去 明确的特殊的类型 。 参数化类型 ,把类型当作参数一样的传递。 通俗一点来讲:泛型 是JAVA 中一种十分强大的机制,因为它能够完成在 未知元素类型 的情况下对元素进行操作。 但是,泛型 只在编译阶段有效 ,即在编译过程中,程序会正确的检验泛型结果。而编译成功后,* .class 文件是不包含任何泛型信息的 (这就是JVM 的泛型擦除机制) 并且,泛型类只能在子类或者父类被调用。 那么,本人再来讲解一下使用 泛型的好处 : 泛型的好处 : (1): 把运行时期的问题提前到了编译期间 (2): 避免了强制类型转换 (3):优化了程序设计,解决了黄色警告线 ------------------------------------------------------------ 注意:泛型只在 编译期 有效 但在运行期就 擦除 了 (至于 泛型擦除机制 ,本人将在后续的博文中提到,并且对于这个机制,本人也提出了相应的解决方法,希望同学们对此加以注意!!!) 现在,本人来讲解一下有关 泛型的基本格式 : 泛型类 -------- 权限修饰符(public...) class 类名<泛型类型1,…> 泛型方法 ----- 权限修饰符

TypeScript——泛型

和自甴很熟 提交于 2020-02-29 20:29:21
定义 :不预先确定的数据类型,具体的类型在使用的时候才能确定 好处 :1.函数和类可以支持多种类型,增加的程序的可扩展性 2.不必写多条函数重载,联合类型声明,增强代码的可读性 3.灵活控制类型之间的约束 这里可以 把泛型理解为代表类型的参数 泛型函数 // 泛型函数 function log<T>(value: T): T { return value } log<string[]>(['a','b']) // 根据约束的类型带入函数 log(['a',2]) // 可通过TS自身的类型推断 // 用类型别名来实现泛型函数 type Log = <T>(value: T) => T let mylog: Log = log // 具体实现可指定到log函数 泛型接口 interface Log1 { <T>(value: T): T // 与类型别名方式等价 } interface Log2<T> { // 当泛型变量约束整个接口的话,实现时必须指定一个类型 (value: T): T } let mylog1: Log2<number> = log mylog1(1) 泛型类 看上去与泛型接口差不多。 泛型类使用( <> )括起泛型类型,跟在类名后面。 class Log3<T> { run(value: T) { console.log(value) return value

JDK1.5新特性一之泛型(Generics)

孤街醉人 提交于 2020-02-29 19:59:17
有人会疑问,泛型是什么东东? 引用官方的话来说: 泛型就是:“the type system allows a type or method to operate on objects of various types while providing compile-time type safety. It adds compile-time type safety to the Collections Framework and eliminates the drudgery of casting”。看不明白吗??没关系,下面我就给大家解释一下我的理解(注:是我的理解,如果你表达的更好,欢迎指正~)。 说白了,jdk中加入了泛型,可以让我们省去类型强制转换的工作,同时加到编译时异常中来;再说白一点,就是你使用了泛型之后,不用再做强制类型转换了,同时如果你的赋值对象不匹配,那么编译器会警告你这里出错了,而不用再等到程序运行时报了一个ClassCastException的时候才发现代码有问题了。不知道我说的这么白白了,你明白了没有,还没有明白,那请往下看.... 比如,之前我们想要在操作集合类中的对象是这样写: static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ){

你真的会用Gson吗?Gson使用指南(一)

╄→гoц情女王★ 提交于 2020-02-29 19:26:24
你真的会用Gson吗?Gson使用指南(一) JSON (官网) 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便。其重要性不言而喻。解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等,本次我向大家介绍的是Gson。 本篇文章的主要内容: Gson的基本用法 属性重命名 @SerializedName 注解的使用 Gson中使用泛型 一、Gson的基本用法 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个。 基本数据类型的解析 Gson gson = new Gson(); int i = gson.fromJson("100", int.class); //100 double d = gson.fromJson("\"99.99\"", double.class); //99.99 boolean b = gson.fromJson("true", boolean.class); // true String str = gson.fromJson("String", String.class); // String 注:不知道你是否注意到了第2

java 泛型

痴心易碎 提交于 2020-02-29 11:15:04
Java泛型 (generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新 集合类框架 中。对于泛型概念的引入,开发社区的观点是 褒贬不一 。从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误。而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的地方。当然这也是任何有历史的编程语言所需要承担的历史包袱。后续的版本更新会为早期的设计缺陷所累。 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List<Object>作为形式参数,那么如果尝试将一个List<String>的对象作为实际参数传进去,却发现无法通过编译。虽然从直觉上来说,Object是String的父类,这种类型转换应该是合理的。但是实际上这会产生隐含的类型转换问题,因此编译器直接就禁止这样的行为。本文试图对Java泛型做一个概括性的说明。 类型擦除 正确理解泛型概念的首要前提是理解类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的

老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些

做~自己de王妃 提交于 2020-02-29 06:39:10
我一直建议大家不要倾向于学习IL的原因有二: IL能够说明的内容太少,包括大部分.NET“必知必会”。 IL能够获得的信息从高级语言中也大都可以知道。 而这篇文章便是希望通过实例来把第1点解释清楚,而第2点则留给下一篇文章来解释。 在文章开始之前,我先要承认两个错误: 首先,上一篇文章对于“IL”和“汇编”的阐述还有些混淆。在这方面某些朋友给出了一些更确切地说法,IL是一种为.NET平台设计的汇编语言,拥有大量.NET平台中特有的高级特性。而x86汇编等则是与机器码一一对应的文字形式代码。不过为了方便表述,在这一系列文章中,还是 以“IL”来指代.NET平台上的中间语言,以“汇编”来指代x86汇编这种和特定CPU平台紧密相关的事物 ——包括之前那篇文章,其实是在阐述IL和汇编之间的关系和区别,以及该如何对待它们的问题,而并非为IL是否可以被叫做是“汇编”进行争论。 其次,在第1篇文章发布的时候,现在这篇文章,也就是本系列第2篇的标题是“汇编可以看到太多IL看不到的东西”。不过后来在半夜重读这篇文章,并且仔细整理这篇文章的示例时发现出了一个问题——我并不是在讲汇编,要探索CLR中的各种问题也并不是仅仅靠汇编来发现的。当时写文章的时候谈了太多的IL和汇编,最终把自己的思路也给绕了进去。现已修改,希望没有给朋友们造成误解,抱歉。今后我也会尽量避免此类情况发生。 好了

Lua 笔记--迭代器与泛型for

岁酱吖の 提交于 2020-02-29 01:53:35
所谓“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。 function values(t) local i = 0 return function() i = i + 1 return t[i] end end 在上例中,values就是一个工厂。每当调用这个工厂时,它就创建一个新的closure(即迭代器本身)。这closure 将它的状态保存在其外部变量t 和i 中。每当调用这个迭代器时,它就从列表t 中返回下一个值。直到最后一个元素返回后,迭代器就会返回nil,以此表示迭代的结束。 泛型for语法: for <var-list> in <exp-list> do <body> end 其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式只有一个元素,即一句对迭代器工厂的调用。 for 做的第一件事是对in 后面的表达式求值。 简单示例: function values(t) local i = 0 return function() i = i + 1 return t[i] end end t = {1, 2, 3} for element in values(t) do print(element)