泛型

泛型约束

匿名 (未验证) 提交于 2019-12-02 22:09:29
泛型约束:   为什么要使用泛型约束?      通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。 设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用System.Object不支持的任何方法,则必须对该类型参数应用约束。 例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。 编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。   泛型约束的类型: 类型参数必须是值类型。 类型参数必须是引用类型。 此约束还应用于任何类、接口、委托或数组类型。 类型参数必须具有公共无参数构造函数。 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。   使用泛型约束的细节:     1)与其他约束一起使用时,new()约束必须最后指定。          2)class或struct约束必须再其他任何约束之前。          3)struct 约束包含new()约束,且new()约束不能与struct约束结合使用。          4)unmanaged 约束包含struct约束,unmanaged 约束不能与struct或new()约束结合使用        泛型约束的使用类型:     1)泛型约束可以是一个泛型类型参数对应一个约束,或多个约束    

泛型学习笔记

匿名 (未验证) 提交于 2019-12-02 22:06:11
泛型的好处 :类型安全性能高,代码重用扩展好。 泛型的使用 :如果我们需要使用多个泛型来实例化一个类型,那么我们就需要使用说明性的名称,比如TId,TFirstName之类的。 泛型的约束 :   where T : struct -类型T必须是值类型   where T : class -类型T必须是引用类型   where T : Ifoo -类型T必须执行接口Ifoo   where T : foo -类型T必须继承自 foo   where T : new() -类型T必须有一个默认构造函数   where T : U -指定泛型类型T1派生于T2。即多个泛型类型之间有继承关系 泛型继承 :类可以继承自泛型基类,泛型类也可以继承自泛型基类。有一个限制,在继承的时候,必须显示指定基类的泛型类型,型如:public class Child<T>:Base<int>{…} 泛型接口 :需要注意的是,在实现接口时需要指定接口的泛型类型。 泛型方法 :跟泛型类差不多,方法在定义的时候使用泛型类型定义参数。调用的时候使用实际类型替换。 泛型委托 :如果我们需要定义的只是一个功能,但是功能的实现要到具体的地方才能确定,我们就可以使用委托,但是使用委托我们的方法返回值和参数类型就确定了,我们可以让委托具有更高等级的抽象,返回值,参数类型都到具体的地方制定。这里的具体地方就是我们要实现的方法

Java的语法糖

匿名 (未验证) 提交于 2019-12-02 21:53:52
1.前言   本文记录内容来自《深入理解Java虚拟机》的第十章早期(编译期)优化其中一节内容,其他的内容个人觉得暂时不需要过多关注,比如语法、词法分析,语义分析和字节码生成的过程等。主要关注的就是Java的一些语法糖是如何实现的。   语法糖不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的可能。大量使用语法糖可能会迷失其中,不得要领,下面就介绍一下Java的语法糖的实现。 2.泛型与类型擦除   JDK5新增了一个特性,就是泛型。本质是参数化类型的应用,就是所操作的数据类型被指定为一个参数,这种参数可以应用在类、接口和方法的创建中。   Java没有泛型的时候,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化,比如HashMap的get方法,返回的就是Object,因为map中一切皆有可能。但是这样的操作带来了一些风险,如果强转的类型错误,就会在运行期间抛出异常,我们需要在编码期间就发现这个问题。   Java的泛型是一种伪泛型,不是C#那种传统意义上的泛型。在C#中,List<int>和List<String>是两种类型,但是Java中还是List。因为Java的泛型只存在于代码中,编译后泛型就消失了,这个就是所说的类型擦除,取而代之的就是插入了强转代码。将一段含有泛型的Java程序编译后,再反编译回来

JDK7 新特性

匿名 (未验证) 提交于 2019-12-02 21:53:52
想更详细的熟悉JDK7新特性可以浏览 官方介绍 JDK7新特性的目录导航: 二进制字面值 switch 语句支持 String try-with-resources catch 多个类型异常 字面值中使用下划线 类型推断 改进泛型类型可变参数 其它 二进制字面值 在Java SE 7,整数类型(byte,short,int 和 long)也可以使用二进制数。要指定二进制,请添加前缀0b或0B编号。以下示例显示了二进制: // 一个 8-bit 'byte' 值: byte aByte = (byte)0b00100001; // 一个 16-bit 'short' 值: short aShort = (short)0b1010000101000101; // 一些 32-bit 'int' 值: int anInt1 = 0b10100001010001011010000101000101; int anInt2 = 0b101; int anInt3 = 0B101; // B可以是大写 或 小写. // 一个 64-bit 'long' 值。 注意 'L' 后缀: long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L; 二进制可以使数据之间的关系比以十六进制或八进制更明显

Java泛型(类型参数T)3――多接口限制

匿名 (未验证) 提交于 2019-12-02 21:53:52
泛型示例三: public class TPractice<T extends Calendar & SolarTerms & Festival> { // 限制 T类型为继承Calendar 类,并实现SolarTerms、Festival 接口 的类类型 } class Calendar { } interface SolarTerms { } interface Festival { } class Date extends Calendar implements SolarTerms, Festival { } --------------------------------- TPractice<Date> t1 = new TPractice<Date>(new Date()); t1.showTrueType(); 文章来源: Java泛型(类型参数T)3――多接口限制

Java 泛型

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java 泛型 ------------------------------------------------------------------------------------------------------------------- JDK 5 增加泛型支持在很大程度上都是为了让集合能记住其元素的数据类型。 Java 5 以后,Java 引入了 “参数化类型 (parameterized type)” 的概念, Java 的参数化类型被称为泛型 ( Generic ) public class GenericList { } Java 7 泛型的“菱形”语法 ------------------------------------------------------------------------------------------------------------------ 从 Java 7 开始, Java 允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号 (<>) 即可, Java 可以推断尖括号里应该是什么泛型信息。 例如: * * * 2 深入泛型 --------------------------------------------------------------------------------------------------

Java集合面试题

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。 随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。 集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。 (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。 (3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 Java集合框架的基础接口有哪些? Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。 Set 是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List 是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 Map 是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。 一些其它的接口有Queue、Dequeue、SortedSet

Java泛型深入理解

匿名 (未验证) 提交于 2019-12-02 21:53:52
泛型之前 在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性。 此外,如果将方法参数声明为接口,将会更加灵活。 在Java增加泛型类型之前,通用程序的设计就是利用 继承 实现的,例如,ArrayList类只维护一个Object引用的数组,Object为所有类 基类 。 [java] view plain copy public class static class //泛型之前的通用程序设计 private new 0 public int return public void //这里的实现,只是为了演示,不具有任何参考价值 int new 1 for ( int 0 public static void new 1 ); //可以向数组中添加任何类型的对象 0 //问题2――上述强制转型编译时不会出错,而运行时报异常java.lang.ClassCastException 这样的实现面临两个问题: 1、当我们获取一个值的时候,必须进行强制类型转换。 2、 假定我们预想的是利用stringValues来存放String集合, 因为 ArrayList只是维护一个Object引用的数组,我们无法阻止将Integer类型(Object子类)的数据加入

Java 泛型

匿名 (未验证) 提交于 2019-12-02 21:53:32
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现? Java 泛型 。 使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。 泛型方法 你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。 下面是定义泛型方法的规则: 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E>)。 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。 实例 下面的例子演示了如何使用泛型方法打印不同字符串的元素: 实例 public

java静态方法使用泛型

匿名 (未验证) 提交于 2019-12-02 21:52:03
用法 import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; public class StaticMethod { public static void main(String[] args) { System.out.println(test("aaaaa")); //aaaaa 基本用法 System.out.println(test1("aa").get(0).equals("aa")); //true 用于内部包装 System.out.println(test2(new HashSet(), Collection.class).size()); //0 用于强制转换类型 System.out.println(test3("bbbbb")); //bbbbb 装神弄鬼 } public static<T> T test(T obj){ return obj; } public static<T> List<T> test1(T obj){ List<T> list = new ArrayList(); list.add(obj); return list; } public static<T> T test2