泛型

十四,泛型(Generics)

霸气de小男生 提交于 2021-02-15 19:23:35
1. 泛型介绍 Java 泛型编程是 JDK1.5 版本后引入的 . 泛型让编程人员能够使用类型抽象 , 通常用于集合里面 . 最大的特点是泛型中的属性可以由外部决定 . 类的泛型声明格式 : class 类名称 < 泛型类型 , 泛型类型 ... ...>{} 示例 : List myIntList=new LinkedList(); myIntList.add(new Integer(0)); Integer x=(Integer)myIntList.iterator().next(); // next()返回的是Object,所以必须强转 注意第 3 行 , 存储在 List 里面的对象类型是 Integer, 但是在返回列表中元素时 , 还是必须强制转换类型 , 这是为什么呢?原因在于 , 编译器只能保证迭代器的 next() 方法返回的是 Object 类型的对象 , 为保证 Integer 变量的类型安全 , 所以必须强制转换 . 这种转换不仅显得混乱 , 更可能导致类型转换异常 ClassCastException, 为保证操作安全 , 减少转换发生错误 , 而泛型使取出变得非常容易 , 不需要再使用向下转型 . 这就是泛型设计的初衷 . 示例 : List<Integer> myIntList=newLinkedList<Integer>(); myIntList

Java泛型的一些事

扶醉桌前 提交于 2020-05-08 23:06:46
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的 “任意化” , “任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。 对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。    泛型的好处 是 在编译的时候检查类型安全,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会 。 本篇博文将从如下几个方面入手,简述一下Java泛型的一些事儿: 泛型的修饰范围 使用&实现多重限制 类型擦除 <? super T>, <? extends T>, <?>通配符的使用 泛型的修饰范围 泛型可以修饰接口,修改类,修饰方法。下面给出几个例子: 泛型接口示例 public interface List<E> extends Collection<E> { ... Iterator<E> iterator(); boolean add(E e); boolean addAll(Collection<? extends E> c); ... } 泛型类示例 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable,

造轮子的时候不敢用不会用泛型?那你看这篇就够了!

烂漫一生 提交于 2020-04-07 11:53:02
解决许多java开发 或者android开发 在平时写一些基础架构,或者是造一些轮子的时候不敢用泛型,用不好泛型的问题。甚至有些人使用泛型的时候报错都只会用idea提示的方法来修改代码,却不知这样改的原因,也不知道强转泛型会有什么恶果。 泛型用来解决什么问题 先定义一个模仿List 的泛型list。我们来看看这个乞丐版的list能帮我们做什么事 public class CustomList<T> { Object[] array = new Object[0]; ​ public T get(int index) { return (T) array[index]; } ​ public void add(T instance) { array[array.length - 1] = instance; } } 看看怎么使用他 CustomList<String> customList = new CustomList<>(); customList.add("hahahaha"); String c = customList.get(0); 到这,我们来看看 到底有啥好处。首先看这个add方法,有了泛型以后,我们就不需要担心类型转换错误了。 因为我们在定义的时候 指定了泛型的类型,所以如果我们在调用add方法的时候传了一个 非string类型的 那么ide就会报错了

33、最简单的mvc框架tiny,自动转型TinyMap

痴心易碎 提交于 2020-04-07 04:58:08
前面我说的实现一个自动转型功能的TinyMap,实现思路前面已经说过,我引用下 解决思路: 重写一个TinyMap类继承HashMap。我们实现getInt,getString等方法,调用这些方法可以对类型自动转换,当使用get方法时,其实是调用HashMap的get方法,放回object类型,代码如下: TinyMap tMap = new TinyMap(参); tMap.getInt(key); tMap.getString(key); tMap.get(key);//Ojbect 然后由前置控制器中将页面的参数转换为TinyMap类型(现在转换为HashMap),最后放入action参数中。由于action中参数为map接口,所有对原设计无影响,用户可同时使用HashMap和TinyMap的方法。 TinyMap.java package tiny; import java.util.Date; import java.util.HashMap; public class TinyMap extends HashMap<String, Object> { public TinyMap() { super(); } public TinyMap(HashMap<String, Object> map) { super(); this.putAll(map); } public

C# TypeOf 和GetType的区别

℡╲_俬逩灬. 提交于 2020-04-06 01:27:50
相同点:两者返回的都是 System.Type 区别TypeOf是一个运算符,只能针对类型进行运算。 GetType是一个集成自Object的方法,任何一个object的变量都可以调用。 以下来自msdn: C# typeof 运算符(在 Visual Basic 中为 GetType 运算符,在 Visual C++ 中为 typeid 运算符)返回一个 Type 对象。 表示某个类型是唯一的 Type 对象;即,两个 Type 对象引用当且仅当它们表示相同的类型时,才引用相同的对象。 这允许使用参考等式来比较 Type 对象。 这个类是线程安全的;多个线程可以同时从此类型的一个实例读取数据。 Type 的实例可表示以下任何类型: 类 值类型 数组 Interfaces 指针 枚举 构造泛型类型和泛型类型定义 构造泛型类型、泛型类型定义和泛型方法定义的类型实参和类型形参 可以通过下列方式获得对与某个类型关联的 Type 对象的引用: Object . . :: . GetType 方法返回表示实例类型的 Type 对象。 静态 GetType 方法返回 Type 对象,该对象表示由其完全限定名指定的类型。 Module . . :: . GetTypes 、 Module . . :: . GetType 和 Module . . :: . FindTypes 方法返回 Type

02-02-08、JDK8的语法糖

风流意气都作罢 提交于 2020-04-05 19:12:24
​1、什么是语法糖 如果要来进行一个拆字游戏的话,语法糖可以拆分成“语法” 和 “糖”,每一种计算机语言都有自己的语法,Java也不例外。 语法就是在这一个语言中,要表示一种行为的表示模式,如赋值:int i = 666;如循环while(foo){},语法在一种语言的运行环境中是原生支持的,是体现在其运行时当中的。 糖是则是一种对于吃它的人来说感觉到甜的碳水化合物,往其他食物中加入糖会让食物变甜,吃糖能让人愉悦。 语法糖(Syntactic Sugar)就是给语法裹上一层糖,因此语法糖也称语法糖衣,让使用这些被裹上糖的语法的编码人员感觉到“甜”。例如,Java中使用for循环语法对一个集合进行遍历,写法为: int [] collection = new int [ 6 ]; for ( int i = 0 ; i < collection.length; i++){ // do something } 而现在,你只需要这么写就行: int [] collection = new int [ 6 ]; for ( int i : collection){ // do something } 是否内心会感到小小的“甜”呢。 有人会感觉很奇怪,我就是这么写的啊,这不就是Java的语法么?还说是什么语法糖!呸!~ 我们都知道,Java是一门高级语言,它的运行环境JVM执行的是字节码

(原創) 回讀者的信,一篇學習C#/C++/OO的FAQ (OO) (Design Pattern) (C/C++) (.NET) (C#)

会有一股神秘感。 提交于 2020-04-04 22:38:28
Abstract 因為我覺得這是很多人都會有的疑問,所以我將回復的內容公開出來和大家分享。 讀者Email內容 您好: 在拜讀了您在 " 博客園 " 的一些文章之後,有個問題想請教您,希望不會打擾到您。 從文章中得知您是從C#轉C++的,但是現在C#不是當紅炸子雞嗎? 怎麼會想轉學C++呢? 學習C#是不是要打好C++的基礎呢? 蠻多文章對我而言有點深度,看來我要再加把勁才行了。 我的回信 你好 >>從文章中得知您是從C#轉C++的,但是現在C#不是當紅炸子雞嗎? 怎麼會想轉學C++呢? C#和C++專屬不同的領域 井水不犯河水 如網頁、商用軟件、資料庫這些,本來就該用C#寫,也不該用C++寫。 但是OS、Driver、嵌入式系統、Game、3D、影像處理這些領域C#也無法搶,因為C#的無法寫底層的OS、Driver、嵌入式系統,速度也無法達到Game、3D的需求。 舉個例子來說,你看過Microsoft哪個軟體用C#寫嗎? XP、Vista、Office、SQL Server,就連C# compiler也是C++寫出來的,這也是微軟被很多人批評的一個地方,大力鼓吹C#,自己卻從來沒有軟體用C#,除了微軟的網站用ASP.NET且用C#寫外。 所以其實我C#和C++都很喜歡,若以語法來說,C#乾淨很多,也穩定許多,大部分程式,若和速度牽涉不大,且記憶體可以接受,我會用C#寫

《Effect Java》 归纳总结

感情迁移 提交于 2020-04-03 22:06:44
目录: 一、创建和销毁对象 (1 ~ 7) 二、对于所有对象都通用的方法 (8 ~ 12) 三、类和接口 (13 ~ 22) 四、泛型 (23 ~ 29) 五、枚举和注解 (30 ~ 37) 六、方法 (38 ~ 44) 七、通用程序设计 (45 ~ 56) 八、异常 (57 ~ 65) 九、并发 (66 ~ 73) 十、序列化 (74 ~ 78) 正文: 第一章: 创建和销毁对象 1、考虑用静态工厂方法代替构造器 优: ① 有名称 ② 不必在每次调用它们的时候都创建一个对象 ③ 可以放回原返回类型的任何子类型的对象 ④ 在创建参数化类型实例的时候,代码更简洁 缺: ① 类如果不含公有的或受保护的构造器,就不能被子类化 ② 与其他一般的静态方法无多大区别 2、 遇到多个构造器参数时要考虑用构造器 3、用私有构造器或者枚举类型强化 Singleton 属性 4、通过私有构造器强化不可实例化的能力 5、避免创建不必要的对象 6、消除过期的对象引用 7、避免使用终结方法 第二章: 对于所有对象都通用的方法 8、覆盖 equals 时请遵守通用约定 ① 类的每个实例本质上是唯一的 ② 不关心类是否提供了“逻辑相等”的测试功能 ③ 超类已经覆盖了 equals, 从超类继承过来的行为对于子类也是合适的 ④ 类是私有的或包级私有的,可以确定它的 equals 方法永远不会被调用   

c#委托语法

眉间皱痕 提交于 2020-04-03 21:46:56
在c#中可以使用委托来实现一些接口的功能,委托也是可以实例化的,实例化委托的参数就是委托对应的方法,然后将该实例赋值给委托变量,执行该委托变量来调用委托中的方法,请看如下代码: static class Program { delegate void TestDelegate(string msg); [STAThread] static void Main() { TestDelegate td = new TestDelegate(TestDelegateMthod); td("hello"); } private static void TestDelegateMthod(string msg) { Console.WriteLine(msg + "!"); } } 需要注意的是,委托相关的操作符有三个:=,+=,-+,=的含义是将=右边的委托实例赋值给=左边的委托变量,如果该变量已经包含了委托实例,则以前的委托实例将被新的实例所取代,+=的含义是将+=右边的委托实例添加到+=左边的委托变量中,委托变量可以保存多个委托实例,如果该变量已经保存有委托实例了,则会把新的委托实例添加到委托变量中,-+的含义是从-+左边的委托变量中移除右边的委托实例 在实例化委托时可以不使用new关键字,请看如下代码: TestDelegate td = TestDelegateMthod;

iOS学习笔记47-Swift(七)泛型

放肆的年华 提交于 2020-04-02 05:50:39
一、Swift泛型介绍 泛型是为 Swift 编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可以起到占位符的作用,当类型暂时不确定的,只有等到调用函数时才能确定具体类型的时候可以引入泛型。 我们之前实际上已经使用过泛型,例如: Swift 的 Array 和 Dictionary 类型都是泛型集。 你可以创建一个 Int 数组,也可创建一个 String 数组,或者甚至于可以是任何其他 Swift 的类型数据数组。同样的,你也可以创建存储任何指定类型的字典( Dictionary ),而且这些类型可以是没有限制的。 我们为什么要使用泛型呢?下面有个例子可以简单说明使用泛型的好处 //定义一个函数,要求追加数组数据到指定一个数组中 func appendIntToArray(src:[Int],inout dest:[Int]) { // 遍历并加到数组后边 for element in src{ dest.append(element) } } //使用copyIntArray添加整形数组数据 var arr = [2,5] appendIntToArray([12,9], dest: &arr) print(arr) // [2,5,12,9] //那么再要求让你实现添加字符串呢,好吧重写一个 func appendStringToArray(src: