泛型

Java 为什么不能创建泛型数组?

妖精的绣舞 提交于 2019-12-07 05:07:05
泛型是 JDK 1.5 中引入的新特性, 首先我们来思考下 java 为什么要引入泛型, 我们看如下代码: List list = new ArrayList(); list.add(55); list.add("dd"); System.out.println(((Integer) list.get(1)) - 5); 这段代码在编译器是没有任何问题的, 可以通过编译, 但是运行时会得到 java.lang.ClassCastException 异常, 如果使用泛型的话, List<Integer> list = new ArrayList<>(); list.add(55); list.add("dd"); // 编译错误 System.out.println(((Integer) list.get(1)) - 5); 到这里我们明白了: java 之所以引入泛型是为了增强程序的安全性和正确性, 以便在编译期就能检查出类型相关的错误. 那么既然这样, 为什么不能使用泛型数组呢? 首先假设如果可以使用泛型数组, 我们看下面一段代码: List<Integer>[] list = new ArrayList<Integer>[10]; // 泛型数组 Object[] objects = list; List<String> stringList = new ArrayList<>

java泛型(笔记)

我怕爱的太早我们不能终老 提交于 2019-12-07 05:06:46
一、泛型 JDK1.5 增加泛型支持在很大程度上都是为了让 集合 能够记住其元素的数据类型。在没有泛型之前,一旦把一个对象丢进java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理。这样取出来使用时,往往需要强制转换,效率降低。 1.1 概念 所谓 泛型 ,就是允许在定义 类、接口、方法 时使用类型形参,这个类型形参在声明变量、创建对象、调用方法时动态地指定。 从java5开始,java引入了 参数化类型(parameterized type) ,运行程序在创建集合时指定集合元素的类型。 java的参数化类型也被称为泛型 。 1.1 使用泛型的好处: 安全: 在编译的时候检查类型安全。 省心: 所有的强制转换都是自动和隐式的,提高代码的重用率。 1.2 泛型的基本用法 使用泛型,可以在编译时进行类型转换检查,而不使用泛型,在运行时才检查 使用泛型,集合自动记住所有集合元素的 数据类型 ,从而无须对集合元素进行强制类型转换。 1.2泛型字母 1.3 java7泛型的菱形语法 在java7以前,泛型的格式: List<String> strList = new ArrayList<String>(); 在java7开始,可以使用下面的方式: List<String> strList = new ArrayList<>(); java可以推断尖括号里应该是什么类型

集合框架中的泛型介绍下?[中高]

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 05:06:30
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 在Java集合类框架中泛型被广泛应用。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 思考: 假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现? 当然是可以使用 Java 泛型。 一 泛型方法 1)可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。 下面是定义泛型方法的规则: 1 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。 2 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。 3 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。 4 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。 参考代码:GenericMethodTest // 测试泛型方法 public class GenericMethodTest { // 泛型方法

java中泛型学习总结

十年热恋 提交于 2019-12-07 05:06:16
为什么需要使用泛型: 1):存储任意类型的数据在集合中 ,但是取出来都是Object类型的,此时就得强转. List list = new ArrayList();list.add(1); //Interger类型Object ele = list.get(0); //现在需要调用Interger类中的方法I nterger num = (Interger) ele;System.out.println(num); 2): 约束存储到集合中的元素必须是相同的数据类型 ( 相同的数据类型才能做比较 , 比如 TreeSet 类 ) . 3):设计一个点(Point)类,来封装坐标位置,要求坐标位置支持String类型.Integer类型/Double类型. 如果重写多个方法是非常不雅的。 泛型 (GenericType), 从 Java5 开始支持的新的语法 : 什么是泛型: 1):广泛通用的类型. 2):代码模板中类型不确定,谁调用该段代码,谁指明类型是什么. 泛型类:直接在类/接口上定义的泛型. 使用泛型: 保证前后类型相同. List<String> list = new ArrayList<String>();//该List集合中只能存储String类型的元素. 因为前后类型相同,所以从Java7开始,退出泛型的菱形语法 <> . List<String> list =

Java集合与泛型学习笔记

扶醉桌前 提交于 2019-12-07 05:05:54
1:Java集合类 首先我们思考为什么出现集合类? 理由: 1面向对象语言对 事物的体现都是以对象的形式 ,所以为了方便对多个对象操作,就对对象进行储存, 集合 就是储存对象最常用的一种方式 2 数组和集合同是容器,有何不同? 数组虽然也可以储存对象,当是长度固定的。集合长度是可变的 。数组可以储存基本数据类型, 集合只可以储存对象引用(地址)(可以是不同类型的对象引用) Java集合 和 接口 共同组成 Java集合框架 Java集合框架 中有许多容器(边框),为什么有这么多容器(边框)? 每一个边框(容器)对数据的储存方式都有不同 (这个储存方式叫 数据结构 ) 注:java集合框架中有许多的接口和类我们只要求掌握Collection接口, List接口, Set接口,ArrayList类 ,Linkedlist类,HashSet类,TreeSet类,HashMap类,TreeMap类,以上的类与接口下面会一一概述 Collection接口 下的两个 List接口 , Set接口。 List接口:元素是有序的,元素可以重复,应为有索引 Set接口:元素是无序的,不可以重复 1:List接口 1:ArrayList类 每个ArrayList实例都有一个 容量 。 容量是用于存储列表中的元素的数组(数据结构)的。 它总是至少与列表大小一样大。 当元素添加到ArrayList时

Java深度历险 Java泛型

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

C#委托(delegate、Action、Func、predicate)和事件

▼魔方 西西 提交于 2019-12-06 18:42:28
一、前言 刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难。在项目中运用委托和事件,你会发现他非常棒,这篇博文算是自己对委托和事件的一次梳理和总结。 二、委托 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托传递的是对方法的引用。 2.1、delegate 声明委托就必须使用关键字“delegate”,委托是先声明,后实例化。至少0个参数,至多32个参数 格式如下所示: private delegate string GetAsString(); 委托是一个类,所以他的实例化跟类的实例化一样,只是他总是接受一个将委托方法作为参数的构造函数。调用委托方法就有两种方式,如下所示: int i = 10; var method = new GetAsString(i.ToString); //调用方法一 Console.WriteLine($"method方法{method()}"); //调用方法二 Console.WriteLine($"method.Invoke方法{method.Invoke()}"); 运行结果: 2.2、Action Action是无返回值的泛型委托,可以接受0个至16个传入参数 Action 表示无参,无返回值的委托 Action<int,string>

JAVA泛型,超详细

只愿长相守 提交于 2019-12-06 18:25:00
本文转载,转载出处不详 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢? 顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参), 然后在使用/调用时传入具体的类型(类型实参)。 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中, 操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 一个栗子 一个被举了无数次的例子: List arrayList =new ArrayList(); arrayList.add("aaaa"); arrayList.add(100);for(inti = 0; i< arrayList.size();i++){ String item = (String)arrayList.get(i); Log.d("泛型测试","item = " + item); } 毫无疑问,程序的运行结果会以崩溃结束: java.lang.ClassCastException: java

泛型

南笙酒味 提交于 2019-12-06 15:21:47
1. 什么是泛型 泛型是一个不确定类型的特殊类型,它在使用时才明确类型,这样的好处: 不用代码强转 把运行问题提前到了编译时期 2. 分类 泛型类 public class Object<T> {} 泛型方法 public void foo(T t) {} 泛型接口 public interface Inter<T> {} 明确泛型 public void foo(List<Sting> t) {} 不明确泛型 public void foo(T t) {} 3. 操作 现在有一个需求,把User类型放入集合中,然后遍历 没有使用泛型 ArrayList list = new ArrayList(); User user1 = new User(); User user2 = new User(); list.add(User1); list.add(user2); //这里容易发生错误,如果不小心把非User类型放入集合呢?这样只有运行时才知道错误,eg: //list.add("一个非User类型"); for(user : list){ System.out.println(user); } 使用了泛型 ArrayList<User> list = new ArrayList(); User user1 = new User(); User user2 = new User(

C#中Json转换主要使用的几种方法!

巧了我就是萌 提交于 2019-12-06 14:32:08
这篇主要介绍2、4。第三种方法使用的比较局限,所以我没有深入学习。 第二种方法   我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A、利用serializer获取json的泛型对象 利用Dictionary<string,object>接收转换完的json对象,然后用查询泛型的指令即可提取想要的json对象。 string JsonData = “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”; JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary<string,object> json = (Dictionary<string, object>)serializer.DeserializeObject(JsonData); string firstKey = json.ElementAt(0).Key; string secondKey = json.ElementAt(1).Key; 当然还有很多其他数据类型,所以要灵活运用转换。 object[] jsonInnerObj = (object[])serializer.DeserializeObject(jsonList); //强制类型转化 Dictionary<string, object>