泛型

19.8消除泛型和对泛型的限制

巧了我就是萌 提交于 2019-12-06 14:25:52
要点提示: 编译器可使用泛型信息,但这些信息在运行时是不可用的。这被称为是类型消除。   泛型是使用一种称为类型消除(type erasure)的方法来实现的。编译器使用泛型类型信息来编译代码,但是随后会消除它。因此,泛型信息在运行时是不可用的。这种方法可以使泛型代码向后兼容使用原始类型的遗留 代码。   泛型存在于编译时。一旦编译器确认泛型类型是安全使用的,就会将它转换为原始类型。例如,编译器会检查图a的代码里泛型是否被正确使用,然后将它翻译成如图b所示的在运行时使用的等价代码。图b的代码使用的是原始类型。   当编译泛型类、接口和方法时,编译器用Object类型代替泛型类型。例如编译器会将图a中的方法转换为图b中的方法。   如果一个泛型类型是受限的,那么编译器就会用改受限类型来替换它。例如编译器会将图a中的方法转换为图b中的方法。 来源: https://www.cnblogs.com/cglib/p/11989754.html

java 泛型-擦除erasure

假如想象 提交于 2019-12-06 14:23:47
类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List<Object>和List<String>等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C++模板机制实现方式之间的重要区别。 很多泛型的奇怪特性都与这个类型擦除的存在有关,包括: 泛型类并没有自己独有的Class类对象。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。 静态变量是被泛型类的所有实例所共享的。对于声明为MyClass<T>的类,访问其中的静态变量的方法仍然是 MyClass.myStaticVar。不管是通过new MyClass<String>还是new MyClass<Integer>创建的对象,都是共享一个静态变量。 当泛型遇见重载: public class GenericTypes { public static void method

C#基础提升系列——C# 泛型

一曲冷凌霜 提交于 2019-12-06 13:49:51
C# 泛型(Generics) 泛型概述 泛型是C#编程语言的一部分,它与程序集中的 IL ( Intermediate Language ,中间语言)代码紧密的集成。通过泛型,我们不必给不同的类型编写功能相同的许多方法和类,而是可以创建独立于被包含类型的一个类或方法。 例如,通过使用泛型类型参数 T,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险。使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。 泛型性能 泛型的一个主要优点是性能。值类型存储在栈上,引用类型存储在堆上。从值类型转换为引用类型称为装箱;从引用类型转换为值类型称为拆箱。对值类型使用非泛型集合类,常常需要将值类型和引用类型互相转换,进行装箱和拆箱操作,性能损失比较大。而使用了泛型,可以很好的解决这一问题,泛型可以不再进行装箱和拆箱操作。 泛型类型安全 泛型的另一个特性是类型安全。例如,在泛型类 List<T> 中,泛型类型 T 定义了允许使用的类型。假设有一个泛型实例为 List<int> ,它在添加元素时,就只会添加类型为 int 的数值到集合中。 泛型允许二进制代码重用 泛型允许更好的重用二进制代码,泛型类可以定义一次,使用许多不同的类型实例化。例如,泛型类 List<T> 可以实例化为 List<int> 、 List<string> 、 List

MyBatis-Plus使用(3)-条件构造器

╄→гoц情女王★ 提交于 2019-12-06 12:56:41
说明:   以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中   以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true   以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)   以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)   以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!!!   以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!   使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!!!   有任何疑问就点开源码看,看不懂函数的点击我学习新知识 警告:   wrapper 很重   传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)   正确的 RPC 调用姿势是写一个 DTO

java知识点整理 - 2

落爺英雄遲暮 提交于 2019-12-06 12:53:27
1、抽象类能不能被实例化?为什么?    抽象类不能被实例化,因为抽象类和接口的设计就是来规定子类行为特征的,就是让其他类继承,是多态思想的一种设计体现。 2、抽象方法可以被private修饰吗?为什么   抽象方法不能被private修饰,因为抽象方法就是要子类继承重写,而private子类不可被重写 3、接口能不能有方法体   jdk8之前接口不能有方法体,jdk 8之后新增了static方法和default方法 4、集合   4.1 list和set的区别 list允许有多个null值,set只允许有一个null值 list允许有重复元素,set不允许有重复元素 list可以保证每个元素的存储顺序,set无法保证   4.2 那种集合可以实现自动排序   TreeSet集合实现了元素的自动排序   4.3 vector、ArrayList、linkedlist有什么区别?使用场景有什么区别?   区别: vector是java提供的动态数组,使用synchronized来保证线程安全,如果非线程安全需要,不建议使用。、 ArrayList是最常用的动态数组,本身并不是线程安全 linkedlist是双向链表集合,非线程安全   使用场景: vector和ArrayList的内部结构是以数组形式存储的,因此非常适合随机访问,但非尾部的删除或新增性能较差

Java泛型--泛型方法

我的未来我决定 提交于 2019-12-06 11:03:55
Java泛型--目录 概述 泛型不但可用作用于整个类上,同时还可以作用于参数化方法. 是否拥有泛型方法,与其所在类是否是泛型没有关系. 泛型方法使得该方法能够独立于类而产生变化,有一个 基本原则:无能何时,只要你能做到,你就应该尽量使用泛型方法 . 定义泛型方法: 将泛型参数列表用尖括号括起来,放在返回值之前 . public class Method { public <T> void f(T t){ System.out.println(t.getClass().getName()); } public static void main(String[] args) { Method method = new Method(); method.f("123"); method.f(111); method.f(new Method()); } } /*输入结果: java.lang.String java.lang.Integer zhk.com.Method */ 在上述例子中,我们可以像调用普通方法一样调用f(),就好像f()被无限次重载了意义. 注意: 在使用泛型类的时候,必须在创建对象的时候指定参数类型的值,但是使用泛型方法时通常不需要指明参数类型,因为编译器会为我们找出具体的类型,这称为 参数类型推断 . 在传入基本类型时,自动打包机制会接入,自动包装成对应的对象

13.6Comparable接口

爱⌒轻易说出口 提交于 2019-12-06 10:07:13
要点提示: Comparable接口定义了conpareTo方法,用于比较对象。   public interface Comparable<E>{     piblic int compareTo(E o);   }   compareTo方法判断这个对象相对于给定对象o的顺序,并且当这个对象小于、等于或大于给定对象o时,分别返回负整数、零或正整数。   Comparable接口是一个泛型接口。在实现该接口时,泛型类型E被替换成一种具体类型。   数字是可比较的、字符串是可比较的、日期也是可比较的。 来源: https://www.cnblogs.com/cglib/p/11976007.html

利用反射动态创建类型的三种方式

旧时模样 提交于 2019-12-06 09:56:28
public static T GetModel<T>(T oModel) { var model = default(T) ; //创建对象方法一:使用构造函数创建 model = (T)typeof(T).GetConstructor(new System.Type[] { }).Invoke(new object[] { });//反射得到泛型类的实体 //创建对象方法二:使用Activator model = (T)Activator.CreateInstance(typeof(T)); //创建对象方法三:使用Activator创建泛型类型对象     //T类型本身也是个泛型类型,需要先获取泛型类型,再通过泛型类型的Type创建对象        var newType = typeof(T).MakeGenericType(typeof(int),typeof(string));        model = (T)Activator.CreateInstance(newType); return model; } 来源: https://www.cnblogs.com/fanfan-90/p/11975528.html

集合泛型的不变性,而数组具有协变性,注意赋值容易导致的出错

ε祈祈猫儿з 提交于 2019-12-06 09:56:01
@大神爱吃茶   泛型的实际应用情况和通配符的使用,关于大范围和小范围互相赋值的时候JVM编译报错的问题: 问题描述:继承关系 class A {} class B extends A {} class C extends A {} class D extends B {} 下面给出了几种说法: The type List<A>is assignable to List. The type List<B>is assignable to List<A>. The type List<Object>is assignable to List<?>. The type List<D>is assignable to List<?extends B>. The type List<?extends A>is assignable to List<A>. The type List<Object>is assignable to any List reference. The type List<?extends B>is assignable to List<?extends A>. (1)首先谈泛型只是在编译期保证对象类型相同的技术,比如在指定的类中声明了一个泛型,那么表示在此类中某一个属性的类应该是声明的这种类型的,而真正在代码运行的时候JVM会查出来泛型的存在。 (2

Java泛型 通配符详解

半城伤御伤魂 提交于 2019-12-06 07:04:51
文章目录 用法简介 数组协变 `<? extends 类型>`获得泛型类的“协变” `<? extends 类型>`与`<? super 类型>` JDK实际例子 通配符与泛型方法的类型推断 泛型方法和泛型类中只是使用了类型参数的方法 带通配符的引用之间赋值必须相容 总结 用法简介 通配符 ? 后只允许出现一个边界。 通配符只允许出现在引用中(普通变量引用、形参),一般是用作 <? extends 具体类型> 或者 <? super 具体类型> 。相对地,比如通配符不允许出现在泛型定义中(泛型类、泛型接口、泛型方法的 < > 里), class one<? extends Integer> {} 这样是不允许的,类定义时继承泛型类时的 < > 里也不可以出现。在泛型类或泛型方法的 { } 里还有泛型方法的形参上,配合占位符,甚至可以使用 ? extends T 或者 ? super T 这种形式来用作引用。 在new泛型类的时候也不可以使用通配符,比如 new ArrayList<?>() 。泛型方法的显式类型说明也不可以使用通配符。 数组协变 具体讲通配符之前,有必要先讲一下数组协变。数组协变可以理解为多态,即子类对象数组可以向上转型为父类对象数组的引用。由于java里的数组在初始化后一定会记住元素的类型,虽然数组协变会带来一些问题(下例就会演示),但有了