泛型

java反射

余生长醉 提交于 2020-02-25 23:34:47
动态编程 程序运行过程中,可以改变程序的结构或变量类型。 虽然java不是动态语言,但是java具有一定的动态性,可以利用反射机制,字节码操作获得类似动态语言的操作。 反射是很重要的,他是java里的大哥级别人物,好多不能做的他都可以做。 反射机制 反射机制是指可以在运行时加载,探知,使用编译期间完全未知的类。 也就是说,利用反射机制,可以实例化一个在编译时只知道名字的类,不用new 创建对象。 Class c = Class . forName ( "包名.类名" ) ; 这就是一个常用的利用反射获取对象class的方法,对象的class里面包含了完整的类的结构信息,我们可以通过这个class,实例化一个对象。 同一个类只会被加载一次,只对应一个Class对象,多次获得Class对象,都是同一个Class对象(地址相同) 对象是表示或封装一些数据。一个类被加载之后,jvm会创建一个对应该类的Class对象,类的整个结构信息会被放到对应的Class对象中 获取Class对象的方法 Class.forName(“包名.类名”); 类名.class; (基本数据类型,数组都可以, 数组Class对象是否相同看维度,不看大小 ) 对象名.getClass(); 获得Class对象之后的操作 首先我们来看一下我们获得Class对象的 名字 : System . out . println

Java泛型使用的简单介绍

倾然丶 夕夏残阳落幕 提交于 2020-02-25 14:59:48
转自 https://www.cnblogs.com/LiaHon/p/11332355.html 目录 **一. 泛型是什么** **二. 使用泛型有什么好处** **三. 泛型类** **四. 泛型接口** **五. 泛型方法** **六. 限定类型变量** **七. 泛型通配符** **7.1 上界通配符** **7.2 下界通配符** **7.3 无限定通配符** **八. 总结** 一. 泛型是什么 “泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer, String,自定义的各种类型等,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如List iniData = new ArrayList<>()。 二. 使用泛型有什么好处 以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。

Java 泛型编程

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

LINQ学习

我们两清 提交于 2020-02-24 16:47:18
LINQ需要用到: 隐式类型 var关键字 匿名类型 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。 初始化器 使用对象初始化器,可以在创建时直接向对象赋值,无需显示的调用对象的构造函数。 委托 委托是将方法作为参数传递。 泛型 类型参数,使用参数类型的这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。 泛型委托 重点 匿名方法 在3.0以后使用Lambda表达式,有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托。 这对于 Lambda 表达式来说是不可能的。 lambda表达式 扩展方法 -------------------------------------------------- Ex: LINQ中 where扩展方法定义: 定义了: 泛型类型 <TSource> 返回值类型 IEnumerable<TSource> 扩展类型 this IEnumerable<TSource> source 委托参数 Func<TSource, bool> predicate,委托定义如下: 其中 in out 关键字是告诉编译器

c#关于泛型和Object的效率问题,那个效率高

僤鯓⒐⒋嵵緔 提交于 2020-02-24 12:40:56
一个比较简单的功能,需要把一个未知类型转成我想要的数据类型。 例如:我想转成int int xx = GetValue<int>("1"); private static T GetValue<T>(string str) { return (T)Convert.ChangeType(str,typeof(T)); } 这一句就是先把内容转成object类型,然后再转成我需要的类型。 那如果换成: object obj = GetVlaue("abcd", str.GetType()); private static object GetVlaue(object o,Type t) { if (t.Name == "String") { return o.ToString(); } return null; } 按道理岂不是效率更高? 或者说有没有什么办法不用把泛型转成Object就能返回呢? 小弟正在了解这一部分,有什么错误的地方麻烦各位大佬谅解。 第一段代码肯定效率更高一些,因为是JIT一次榜定,后者反射每次调用一次就花费一次时间。 什么是泛型? C# 语言和公共语言运行时 (CLR) 在 2.0 版本中添加了泛型。泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有相同特征的类和方法:在客户端代码声明并初始化这些类和方法之前

201521123067 《Java程序设计》第8周学习总结

不问归期 提交于 2020-02-24 10:00:37
201521123067 《Java程序设计》第8周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。 2. 书面作业 Q1.List中指定元素的删除题集jmu-Java-05-集合之4-1 1.1 实验总结 ●public static void remove(List list, String str)这个函数的编写难度不大,我首先在JDK文档中查看了List,找到了indexOf(Object o)方法和remove(int index)方法,接着运用indexOf(Object o)方法找出str所在的位置,然后运用remove(int index)方法将该位置上的元素删除就可以了。 ●public static List convertStringToList(String line)这个函数编写的时候有点困难,起初是不理解题目意思,后来通过百度搜索明白了意思,然后在JDK文档中查看了Arrarys,找到asList(T... a)方法,认真看明白之后学会了使用。 1.2 截图你的提交结果(出现学号) Q2.统计文字中的单词数量并按出现次数排序(尽量不要出现代码)题集jmu-Java-05-集合之5-3统计文字中的单词数量并按出现次数排序 2.1 伪代码(简单写出大体步骤) 步骤如下: 1、首先建立一个Map

Java学习笔记(5)

余生长醉 提交于 2020-02-24 05:49:17
集合–Collection 集合是长度可变的容器 Collection 使用示例 public static void main(String[] args) { //Collection是所有单列集合的父接口 //因此在Collection中定义了单列集合(List和Set)通用的一些方法 //这些方法可用于操作所有的单列集合 //创建集合 Collection<String> collection = new ArrayList<>(); //添加元素 collection.add("test1"); collection.add("test2"); System.out.println(collection); //判断元素是否在集合内 boolean if_contain = collection.contains("test1"); if(if_contain == true){ System.out.println("test1存在于集合中"); } //删除集合中的元素 collection.remove("test1"); System.out.println(collection); //查看集合中的元素个数 System.out.println("元素个数: " + collection.size()); //将集合转换为Obeject数组 Object[]

泛型

北城余情 提交于 2020-02-24 04:10:23
一.概念 1.“宽泛的数据类型”,就是将类型由原来的具体的类型泛化。 泛型建立对象时不指定类中属性的具体类型,而是在声明及实例化对象时由外部指定。泛型可以提高数据安全性。 2.作用:提高安全性;避免强转。 二.泛型的简单使用 1.泛型类:可以看做是普通类的工厂 使用要点: ①类型参数(比如这里的T)可以随便写为任意标识,常见的有T,K,E,V等; ②在实例化泛型类时,必须指定T的具体类型,指定的类型参数只能是类类型,不能是基本类型 ③构造函数中可以省略类型参数,省略的类型参数可以从指定的具体类型参数中推断得出 /** * @Author DreamYee * @Create 2020/02/23 15:10 */ public class 泛型 class < T > { private T apple ; private T pear ; public 泛型 class ( ) { apple = null ; pear = null ; } public 泛型 class ( T apple , T pear ) { this . apple = apple ; this . pear = pear ; } public T getApple ( ) { return apple ; } public void setApple ( T apple ) { this .

c#中的引用类型和值类型

*爱你&永不变心* 提交于 2020-02-24 00:09:07
一,c#中的值类型和引用类型 众所周知在c#中有两种基本类型,它们分别是值类型和引用类型;而每种类型都可以细分为如下类型: 什么是值类型和引用类型 什么是值类型: 进一步研究文档,你会发现所有的结构都是抽象类型System.ValueType的直接派生类,而System.ValueType本身又是直接从System.Object派生的。根据定义所知,所有的值类型都必须从System.ValueType派生,所有的枚举都从System.Enum抽象类派生,而后者又从System.ValueType派生。 所有的值类型都是隐式密封的(sealed),目的是防止其他任何类型从值类型进行派生。 什么是引用类型: 在c#中所有的类都是引用类型,包括接口。 区别和性能 区别: 值类型通常被人们称为轻量级的类型,因为在大多数情况下,值类型的的实例都分配在线程栈中,因此它不受垃圾回收的控制,缓解了托管堆中的压力,减少了应用程序的垃圾回收的次数,提高性能。 所有的引用类型的实例都分配在托管堆上,c#中new操作符会返回一个内存地址指向当前的对象。所以当你在创建个一个引用类型实例的时候,你必须要考虑以下问题: 内存是在托管堆上分配的 在分配每一个对象时都会包含一些额外的成员(类型对象指针,同步块索引),这些成员必须初始化 对象中的其他字节总是设为零 在分配对象时,可能会进行一次垃圾回收操作

范型概述和基本使用

无人久伴 提交于 2020-02-23 17:57:42
泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候采取明确的特殊类型。参数化类型,把类型当作参数一样的传递。 格式: <数据类型> 此处的数据类型只能是引用类型 好处: A:把运行期间的问题提前到了编译期间 B:避免了强制类型转换 C:优化了程序设计,解决了黄色警告线 泛型在哪里使用呢? 看API,如果类,,接口,抽象类后面跟的有 < E >,就说要使用泛型。一般来说就是在集合中使用 ArrayList < String > array = new ArrayList < String > ( ) ; //用了泛型,明确定义了ArrayList里面的数据为String类型 array.add ( "hello" ) ; array.add ( "world" ) ; array.add ( "java" ) ; //array.add ( 10 ) ; //JDK5之后自动装箱 //等价于:array.add ( Integer.valueOf ( 10 )) ; //遍历 Iterator < String > it = array.iterator ( ) ; //迭代器是依赖于集合的,集合是什么类型,他也要加什么类型 while ( it.hasNext ( )) { // String s = ( String ) it.next ( ) ; /