泛型

泛型

只谈情不闲聊 提交于 2020-02-04 01:47:48
一、泛型类 泛型->参数化类型->只在编译期有效 进行类型安全检测 MyArrayList my=new… 类型推到-> MyArrayList推导此时T类型就是String类 类名+<泛型参数>{->T E K V} 泛型参数->运行期间:T 直接类型擦除到 Object lass 类名称 < 泛型标识:可以随便写任意标识号,标识指定的泛型的类型 > { private 泛型标识 /*(成员变量类型)*/ var ; . . . . . } } //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic < T > { //key这个成员变量的类型为T,T的类型由外部指定 private T key ; public Generic ( T key ) { //泛型构造方法形参key的类型也为T,T的类型由外部指定 this . key = key ; } public T getKey ( ) { //泛型方法getKey的返回值类型为T,T的类型由外部指定 return key ; } } 二、泛型接口 泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中 / 定义一个泛型接口 public interface Generator < T > {

深入理解public static &ltT&gt T max(Collection&lt ? extends T&gt coll,Comparator &lt? super T&gt comp)

99封情书 提交于 2020-02-03 17:51:19
1. 前几天看源码,遇到一段代码: public static < T > T max ( Collection < ? extends T > coll , Comparator < ? super T > comp ) { } 给我看的一脸懵逼,今天整理完泛型后重新理解,终于能看懂了 2. 解释 第一个位置的 < T > 表示告诉虚拟机,一会我在参数中将要使用 T类型的数据 ,你小子别给我整幺蛾子在编译时报错! 第二个T max 表示使用 T类型的返回值 。 在参数中,使用了Collection集合类,而<? extends T>,表示使用了 受限泛型上限 ,只接受T及其T的子类。 在参数中,使用了Comparator比较器,而<? super T>表示使用了 受限泛型下限 ,只接受T及其T的父类。 3. 整体看来,如果T为int,整句其实可以理解为 public static Integer max ( Collection < 这儿将会是Integer及其子类泛型 > coll , Comparator < 这儿将会是Integer及其父类泛型 > comp ) { } 纯属个人帮助理解方法。。。有些low,见谅! 4. 整理量较大,难免有疏漏,肯定批评指正。 来源: CSDN 作者: l8947943 链接: https://blog.csdn.net/l8947943

泛型

笑着哭i 提交于 2020-02-03 09:38:10
泛型矩阵类 泛型小结 ⦁ 泛型具有参数化类型的能力。可以定义使用泛型类型的类或方法,编译器会用具体的类型来替换泛型类型。 ⦁ 泛型的主要优势是能够在编译时而不是运行时检测错误。 ⦁ 泛型或方法允许指定这个类或方法可以带有的对象类型。如果试图使用带有不兼容对象的类或方法,编译器会检测出这个错误。 ⦁ 定义在类、接口或者静态方法中的泛型称为形式泛型类型,随后可以用一个实际具体类型来替换它。替换泛型类型的过程称为泛型实例化。 ⦁ 不使用类型参数的泛型类称为原始类型,例如Arraylist。使用原始类型是为了向后兼容java较早的版本。 ⦁ 通配泛型类型有三种形式:?、?Extends T 和 ?Super T,这里的T代表一个泛型类型。第一种形式?称为非受限通配,它和?Extends Object 是一样的。第二种形式?Extends T称为受限统配,代表T或者T的一个类型。第三种类型?Super T 称为下限通配,代表T或者T的一个父类型。 ⦁ 使用称为类型消除的方法来实现泛型。编译器使用泛型类型信息来编译代码,但是随后消除它。因此泛型信息在运行时是不可用的。这个方法能够使泛型代码向后兼容使用原始类型的遗留代码。 ⦁ 不能使用泛型类型参数来创建实例。 ⦁ 不能使用 泛型类型参数 来创建数组。 ⦁ 不能在静态环境中使用类的 泛型类型参数 。 ⦁ 在异常类中不能使用 泛型类型参数 。

Java泛型通配符

…衆ロ難τιáo~ 提交于 2020-02-02 19:30:37
class Fruit{} class Apple extends Fruit{} class Plate<T>{ private T item; public Plate(){} public Plate(T t){ item=t; } public void set(T t){ item=t; } public T get(){ return item; } } public class GenericTest { public static void main(String[] args) { Fruit a=new Fruit(); Fruit b=new Apple(); Plate<Fruit> c=new Plate<Fruit>(); //Apple是Fruit的子类,但Plate<Apple>不是Plate<Fruit>的子类 //Plate<Fruit> d=new Plate<Apple>(); //? extends Fruit就代表Fruit或Fruit的子类 Plate<? extends Fruit> e=new Plate<Apple>(); Plate<? extends Fruit> f=new Plate<>(); //无法set/add,类型不匹配,编译器不知道具体是在处理哪个子类。 //e.set(new Fruit()); //e.set

Object类

自古美人都是妖i 提交于 2020-02-02 09:41:41
Object类概述 Object类是JDK默认提供的一个类。java中除了Object类,所有类都存在继承,默认会继承Object父类 所有类的对象都可以使用 Object 接收。 Object 达到最高参数统一化。 什么时候使用Object类? 对于Object类的使用可以分为两个阶段:JDK 1.5以前,以及JDK 1.5之后。 Object之所以会被大量的进行参数的接收处理,很大的一部分原因在于:你的程序里面需要接受的类型很多,并不固定,可是现在的开发理念中强调的问题不再是这一点了,而是如何可以避免向下转型(如果避无可避,那么就用),因为从JDK1.5之后引入了泛型机制(在基础课程讲解泛型机制的时候重点分析了Object缺陷)。 现在的设计思想是用泛型来避免向下转型的操作(ClassCastException),如果你要认真读了API文档你会发现,可以接收Object类型的方法是越来越少了,开发中尽量回避Object接收的项目为主。 来源: CSDN 作者: 怦然心痛 链接: https://blog.csdn.net/weixin_44861399/article/details/104134151

C#中泛型效率对比(ArrayList和List)

心不动则不痛 提交于 2020-02-02 04:12:31
泛型一般效率比较高,因为它的操作并不是装箱拆箱,也不涉及object类型转换。 下面的一段程序主要测试泛型列表List与数组列表ArayList之间的性能对比。这两种都可以创建列表,且都可以面对不同的数据类型。泛型的数据类型编程中指定。ArrayList类型为object类,会进行数据的装箱和拆箱。 using System ; using System . Collections . Generic ; //使用泛型类必须引用空间 using System . Linq ; using System . Text ; using System . Text . RegularExpressions ; using System . Threading . Tasks ; using System . Collections ; using System . Diagnostics ; //使用时间计时必须引用此空间 namespace TESTT { class Program { public static void TestNonGeneric ( ) { Stopwatch sw = new Stopwatch ( ) ; //计时器 List < int > list = new List < int > ( ) ; //声明List泛型对象,类型为int sw .

C#泛型方法

点点圈 提交于 2020-02-02 01:19:40
一、泛型类型的格式 声明: public void Swap(ref T x,ref T y) //函数名后要跟表示类型用占位符T代替 { //函数体 } 使用: int x=10,y=20; Swap(ref x,ref y); //自动识别,然后用实际类型替换T 示例: class Program { public static void Swap < T > ( ref T x , ref T y ) { T temp = x ; x = y ; y = temp ; } static void Main ( string [ ] args ) { int x = 10 , y = 55 ; Console . WriteLine ( "{0},{1}" , x , y ) ; //输出10,55 Swap ( ref x , ref y ) ; //完整的为Swap<int>(ref x,ref y);<int>可以省 Console . WriteLine ( "{0},{1}" , x , y ) ; //输出55,10 string q = "张三" , p = "李四" ; Console . WriteLine ( q + p ) ; //输出张三李四 Swap ( ref q , ref p ) ; Console . WriteLine ( q + p ) ;

201771010128王玉兰《面向对象程序设计(Java)》第十周学习总结

与世无争的帅哥 提交于 2020-02-01 20:34:39
第一部分:理论知识部分总结: (1) 定义简单泛型类: A:泛型:也称参数化类型(parameterizedtype),就是在定义类、接口和方法时,通过类型参数指 示将要处理的对象类型。 B:泛型程序设计(Genericprogramming):编写 代码可以被很多不同类型的对象所重用。 C: 一个泛型类(genericclass)就是具有一个或多 个类型变量的类,即创建用类型作为参数的类。 (2)泛型方法(可以定义在普通类中,也可以定义在泛型类中)除了泛型类外,还可以只单独定义一个方法作 为泛型方法,用于指定方法参数或者返回值为 泛型类型,留待方法调用时确定。 (3):泛型变量的限定:定义泛型变量的上界用extends,下界用super. A:上下界的说明:a: extends关键字所声明的上界既可以是一个类, 也可以是一个接口;b;一个类型变量或通配符可以有多个限定,限定类 型用“&”分割。 c: 通过使用super关键字可以固定泛型参数的类型为某种 类型或者其超类; d: 当程序希望为一个方法的参数限定类型时,通常可以使 用下限通配符. (4)通配符类型 :通配符 –“?”符号表明参数的类型可以是任何一种类 型,它和参数T的含义是有区别的。T表示一种 未知类型,而“?”表示任何一种类型。这种 通配符一般有以下三种用法: –单独的?,用于表示任何类型。 –? extends

达拉草201771010105《面向对象程序设计(java)》第十周学习总结

筅森魡賤 提交于 2020-02-01 20:18:28
达拉草201771010105《面向对象程序设计(java)》第十周学习总结 实验十 泛型程序设计技术 实验时间 2018-11-1 第一部分:理论知识 泛型:也称参数化类型(parameterizedtype), 就是在定义类、接口和方法时,通过类型参数指 示将要处理的对象类型。(如ArrayList类) 泛型程序设计(Genericprogramming):编写 代码可以被很多不同类型的对象所重用。 泛型类的定义: 1.一个泛型类(genericclass)就是具有一个或多 个类型变量的类,即创建用类型作为参数的类。 如一个泛型类定义格式如下: classGenerics<K,V> 其中的K和V是类中的可变类型参数。 2. Pair类引入了一个类型变量T,用尖括号(<>) 括起来,并放在类名的后面。 3.泛型类可以有多个类型变量。例如: publicclassPair<T,U>{…} 4.类定义中的类型变量用于指定方法的返回类型以 及域、局部变量的类型。 泛型方法: 1. 泛型方法 –除了泛型类外,还可以只单独定义一个方法作 为泛型方法,用于指定方法参数或者返回值为 泛型类型,留待方法调用时确定。 2.泛型方法可以声明在泛型类中,也可以声明在 普通类中。 通配符类型; 通配符 –“?”符号表明参数的类型可以是任何一种类 型,它和参数T的含义是有区别的。T表示一种 未知类型,而“

C#泛型类

北城余情 提交于 2020-02-01 20:06:45
一、泛型类的简介 所谓的泛型就是不知道具体的类型的一种通用表达。泛型和概念和C++中的模板,LabVIEW中的变体略有相似。用泛型定义的类具有多态的作用。 泛型的出现目的在于解决能应用在不同数据类型上的共有代码。 示例如下: class Program { public class Static < T > //定义的泛型类 { int pos ; T [ ] data = new T [ 100 ] ; //定义泛型数组 public void Push ( T obj ) //入栈操作 { data [ pos ++ ] = obj ; } public T Pop ( T obj ) //出栈操作 { return data [ -- pos ] ; } } static void Main ( string [ ] args ) { var stack = new Stack < int > ( ) ; //也可写成:Stack<int> stack=new Stack<int>(); stack . Push ( 5 ) ; stack . Push ( 10 ) ; int x = stack . Pop ( ) ; //x=5 int y = stack . Pop ( ) ; //y=10 Console . WriteLine ( "{0},{1}" , x ,