泛型

Java的泛型知识点总结

霸气de小男生 提交于 2020-01-15 21:00:46
泛型知识点总结 1. 泛型 2. 泛型的基本用法 2.1 泛型类 2.2 泛型方法 2.3 泛型可以随意取名 3. 泛型的继承 3.1 子类明确泛型的类型 3.2 子类不明确泛型的类型 4. 泛型通配符 4.1 无边界通配符 4.2 上边界通配符<? extends E> 4.3 下边界通配符<? super E> 5. 泛型擦除 参考材料 1. 泛型 在JDK5之前,想要表示可变类型,基本都会用上Object类,但是这样会出现类型转换失败的风险。 于是从JDK5开始,Java引入了泛型。泛型的本质是类型参数化,解决不确定具体对象类型的问题。将明确类型这项工作推迟到创建对象时再决定。 参数化类型:是指将类型当成参数的一种来传递。且泛型中的类型只能是引用类型不能是基本数据类型。. 泛型只存在于编译阶段,在编译结束后就不会有泛型概念了。 2. 泛型的基本用法 泛型可以广泛的运用于类,接口,方法当中。编译器通过尖括号<>内部的字母来解析泛型。这个字母可以随意取名,也可以设置多个泛型,中间用 ‘,’ 隔开。 一般我们规定: E表示Element,集合中的某个元素。 T表示Type of object,表示某个类 K表示key,V表示Value,表示键值对的元素。 2.1 泛型类 在类上面定义泛型,直到编程者使用这个类的时候,才定义泛型具体的类型。定义在类上的泛型可以在类的内部随意调用

1.泛型(Generic)

放肆的年华 提交于 2020-01-15 13:36:29
一、泛型 泛型就是封装,将重复的工作简单化 1.泛型方法 public static void Show<T>(T tParameter) {   Console.WriteLine("This is {0}, parameter = {1}, type = {2}", typeof(CommonMethod).Name, tParameter.GetType(), tParameter); } 2.泛型类 public class GenericClass<T>{} 3.泛型接口 public interface GenericInterface<I>{} 4.泛型委托 public delegate void Do<T>(); 5.泛型约束 public static void Show<T>(T tParameter) where T : People//基类约束 //where T : ISport//接口约束 {   Console.WriteLine("This is {0}, parameter = {1}, type = {2}", typeof(CommonMethod).Name, tParameter.GetType(), tParameter);   Console.WriteLine($"{tParameter.Id} {tParameter.Name}"

泛型初步

做~自己de王妃 提交于 2020-01-15 09:38:34
泛型初步 假设我们要实现一个功能:实现对数组元素的逆序操作。 功能需求中没有确定数组元素的具体类型,假设我们把类型限定在八大基本类型中。应该如何实现? 可以用 “重载方法” 的手段 public static int[] revArray(int[] m) {} public static long[] revArray(int[] m) {} 这种方法过于笨,为了简化问题的处理,java提供了泛型的概念。 泛型解决 public class AboutGeneric { public static <T> T[] revArray(T[] m) { T t; for (int i=0; i<m.length/2; i++) { t = m[i]; m[i] = m[m.length-1-i]; m[m.length-1-i] = t; } return m; } } . 泛型标志说明这个方法用到泛型。 泛型(T)只能是类类型,所以T就代表某种类类型。 编码时不确定,运行时才确定 public class Test { public static void main(String[] args) { AboutGeneric Generic = new AboutGeneric(); Integer[] IntegerArray = {1,2,3,4,5,6,7}; //

JAVA基础《泛型》

∥☆過路亽.° 提交于 2020-01-15 05:14:19
泛型 /* * <T>主要用于声明泛型方法和泛型类 */ < T > T getMapper ( Class < T > var1 ) ; //声明getMapper方法是泛型方法 < K , V > Map < K , V > selectMap ( String var1 , Object var2 , String var3 ) ; < T > List < T > selectList ( String var1 ) ; class Point < T > { // 此处可以随便写标识符号 private T x ; private T y ; public void setX ( T x ) { //作为参数 this . x = x ; } public void setY ( T y ) { this . y = y ; } public T getX ( ) { //作为返回值 return this . x ; } public T getY ( ) { return this . y ; } } ; //IntegerPoint使用 Point < Integer > p = new Point < Integer > ( ) ; p . setX ( new Integer ( 100 ) ) ; System . out . println ( p .

Thinking in java学习笔记12:第十四章(类型信息)、第十五章(泛型)

。_饼干妹妹 提交于 2020-01-15 05:06:45
第十四章-类型信息 运行时类型信息使得可以再运行时发现和使用类型信息。 这里书中写了RTTI,RTTI是什么?这其实是作者的一个误会,RTTI是C++里面的 RTTI(Run-time Type Identification),运行时获取类型信息。而java中更适合的表示是反射,可以这么说,java的反射是C发展到java后的结果。 对于反射我其实已经有笔记了,而且我对这张内容表示有一定的怀疑,所以这章内容跳过。 https://blog.csdn.net/asdfghj253/article/details/103626642 第十五章-泛型 这一章的内容在之前的学习中也学习过,所以暂时就选择没有学到的知识点做笔记 1.在泛型代码内部,无法获得任何有关泛型参数类型的信息 2.类型擦除:这里的擦除是指参数类型的擦除。 比如LIst<String>和List<Integer>,将String和Integer擦除,那么都是List类型。 3.边界:边界可以限制类型擦除,强制规定泛型引用类型 这个在之前的学习中就是有限制通配符,来进行限制。(对于这个我感觉还是effective java讲的更精简清楚) https://blog.csdn.net/asdfghj253/article/details/103433006 来源: CSDN 作者: 沙丁鱼flat 链接: https:/

装箱和拆箱

╄→尐↘猪︶ㄣ 提交于 2020-01-15 00:55:45
装箱和拆箱 1、装箱和拆箱   装箱转换是指将一个值类型隐式地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。比如: int i = 10 ; object obj = i ; 装箱的过程 我们也可以用显式的方法来进行装箱操作: int i = 10 ; object obj = ( object ) i ; 2、拆箱转换 和装箱转换正好相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。 拆箱的过程分为两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。 利用如下例子,查看一个对象拆箱的过程 。 int i = 10 ; object obj = i ; int j = ( int ) obj ; 可以看出拆箱过程正好是装箱过程的逆过程。必须注意,装箱转换和拆箱转换必须遵循类型兼容原则。 尽量避免装箱 我们之所以研究装箱和拆箱,是因为装箱和拆箱会造成相当大的性能损耗(相比之下,装箱要比拆箱性能损耗大),性能问题主要体现在执行速度和字段复制上。因此我们在编写代码时要尽量避免装箱和拆箱,常用的手段为: 1. 使用重载方法

java基础

假如想象 提交于 2020-01-15 00:47:54
java基础笔记 第一章 入门须知 1.1 程序开发步骤 编写 编译: 将我们编写的java源文件翻译成jvm认识的class文件,此过程编译器会检查我们所写的程序是否有语法错误 运行 1.2 标识符 定义:自己定义的内容,如类名,方法名,变量名 命名规则: 可以包含:**字母,数字,$(美元符号),_(下划线)** 不能以数字开头 1.3 数据类型转换 自动转换:自动向更适应的类型转换(自动将类型提升) 强制转换:随你,但要看能不能转换成功 加减运算默认是在int类型下的,所以short类型也会发生自动转换 short s = 1; s = s + 1;//编译失败 public static void main(String[] args){ byte b1=1; byte b2=2; //对于常数,编译器是知道的,所以会自动得出结果3,从而确定没有越界而顺利赋值 byte b3=1 + 2; //对于变量,编译器不知道值是多少,会进行自动转换,从而报错,出现异常 byte b4=b1 + b2; System.out.println(b3); System.out.println(b4); } 1.4 运算符 && 短路与:左边是false,右边就不再运算 || 短路或:左边是true,右边就不再运算 ! 取反 1.5 方法 方法必须定义在一个类中的方法外

Autofac框架详解

*爱你&永不变心* 提交于 2020-01-15 00:29:40
一、组件   创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式:    1、类型创建RegisterType   AutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例。主要通过RegisterType<T>() 和 RegisterType(Type) 两个方法以这种方式建立。   ContainerBuilder使用 As() 方法将Component封装成了服务使用。 builder.RegisterType<AutoFacManager>(); builder.RegisterType<Worker>().As<IPerson>();    2、实例创建   builder.RegisterInstance<AutoFacManager>(new AutoFacManager(new Worker()));    单例   提供示例的方式,还有一个功能,就是不影响系统中原有的单例:   builder.RegisterInstance(MySingleton.GetInstance()).ExternallyOwned();  //将自己系统中原有的单例注册为容器托管的单例   这种方法会确保系统中的单例实例最终转化为由容器托管的单例实例。    3、Lambda表达式创建  

Java 之 泛型的概念与好处

*爱你&永不变心* 提交于 2020-01-14 11:15:22
一、泛型的概念   泛型:JDK1.5之后引入的。泛型是指泛华的类型,参数化类型。    生活中的例子:     当有四个瓶子,准备用来装“醋”、“酱油”、“黄酒”、“花椒油”,如果瓶子没有标签的话,那么当这些调料一旦装进去之后,我们就容易忘记哪个瓶子里装了什么,每次用的时候,需要“闻”或“尝”等确认一下才能用,否则就容易加错调料。     生产瓶子的厂家不知道我们将来用这个瓶子装什么,因此我们为了后面的“方便”、“安全”,可以在装完调料之后贴“标签”。    同理可得:     在设计集合这个容器的数据结构时,不知道程序员会用来装什么对象。在设计时不确定元素的类型,但是在使用时,程序员是知道类型的。现在需要一个方式,渠道,让使用者在使用这个集合等时,告知这个集合我里面装的是什么对象。这就需要泛型。     使用集合时,一旦把一个对象“丢进”Java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理。当程序从集合中取出对象后,就需要进行强制类型转换,这种强制类型转换不仅代码臃肿,而且容易引起ClassCastException异常。   Demo: 1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class TestListErr { 5 6 public static void

Func<T,TResult>泛型委托

十年热恋 提交于 2020-01-14 01:53:15
描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: T:此委托封装的方法的参数类型. TResult:此委托封装的方法的返回值类型. 参数: arg:委托封装的方法的参数 返回值:此委托封装的方法的返回值 备注: 可以使用此委托构造一个能以参数形式传递的方法,而不用显式声明自定义的委托.该方法必须与此委托的方法签名想对应. 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且具有返回值. 注意: 若要引用一个具有一个参数并返回void的方法,则需要使用泛型Action<T>委托. 上面接受的只是有一个参数,并有返回值的情况,其实Func委托共有以下形式: public delegate TResult Func<TResult>(); public delegate TResult Func<T,TResult>(T arg); public delegate TResult Func<T1,T2,TResult>(T1 arg1,T2 arg2); public delegate TResult Func<T1,T2,T3,TResult>(T1 arg1,T2 arg2,T3 arg3); public delegate TResult