一 泛型定义
允许在定义类、接口、方法时指定类型形参,这个类型形参在将在声明变量、创建对象、调用方法时时动态确定(即传入实际的类型参数,也可称为类型实参)。JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参。
二 泛型实质
允许在定义接口、类时声明类型形参,类型形参在整个接口,类体内可当成类型使用,几乎所有可使用普通类型的地方都可以使用这种类型形参。例如:使用List类型时,如果为E形参传入String类型的实参,则产生一个新的类型:List<String>类型,可以把List<String>想象成E被全部替换成String的特殊List子接口。
三 类的泛型声明
1 代码示例
public class Apple<T> { // 使用T类型形参定义实例变量 private T info; public Apple(){} // 下面方法中使用T类型形参来定义构造器 public Apple(T info) { this.info = info; } public void setInfo(T info) { this.info = info; } public T getInfo() { return this.info; } public static void main(String[] args) { // 由于传给T形参的是String,所以构造器参数只能是String Apple<String> a1 = new Apple<>("苹果"); System.out.println(a1.getInfo()); // 由于传给T形参的是Double,所以构造器参数只能是Double或double Apple<Double> a2 = new Apple<>(5.67); System.out.println(a2.getInfo()); } }
2 运行结果
苹果
5.67
3 代码分析
上面程序在定义了一个带泛型声明Apple<T>类,使用Apple<T>类就可为T类型形参传入实际类型,这样就可以生成Apple<String>、Apple<Double>形式的多个逻辑子类(物理上并不存在)。
四 泛型类派生子类
1 当从泛型类派生子类的时,不能再包括类型形参。
public class A extends Apple<T>{} 这种定义是错误的。
2 定义类、接口、方法时可以声明类型形参,但使用类型,接口,方法时应该为类型形参传入实际的类型。
public class A extends Apple<String>{} 这种定义是正确的。
3 调用方法时必须为所有的数据传入值,但使用类、接口时,也可以不为类型形参传入实际的类型参数。
public class A extends Apple{} 这种定义是正确的。
4 从泛型类派生子类举例——传入实际类型参数。
public class A1 extends Apple<String> { // 正确重写了父类的方法,返回值 // 与父类Apple<String>的返回值完全相同 public String getInfo() { return "子类" + super.getInfo(); } /* // 下面方法是错误的,重写父类方法时返回值类型不一致 public Object getInfo() { return "子类"; } */ }
5 从泛型类派生子类举例——不传入实际类型参数。
public class A2 extends Apple { // 重写父类的方法 public String getInfo() { // super.getInfo()方法返回值是Object类型, // 所以加toString()才返回String类型 return super.getInfo().toString(); } }
五 泛型的错误用法
1 不能在静态变量声明中使用类型形参。
static T info; //错误的
2 不能在静态方法中使用类型形参。
public static void bar(T msg) //错误的
3 instanceof运算符后不能使用泛型。
if(cs instanceof java.util.ArrayList<string>) //错误的
相关推荐
深入研究Java泛型,我们还需要了解以下关键概念: 1. **类型参数化**:在类、接口或方法声明中使用类型参数,如`<T>`,代表一个未知的类型。 2. **边界约束**:可以为类型参数设定边界,如`<T extends Number>`,...
### JDK1.5新特性泛型深入研究 #### 一、引言 随着软件工程的发展,类型安全成为了程序设计中的一个重要考量因素。Java作为一种广泛使用的编程语言,在其发展历程中不断引入新的特性以满足日益增长的需求。JDK1.5...
在C#编程中,泛型是一种强大的特性,它允许我们创建可重用的类型安全的代码,能够处理多种数据类型。"泛型封装.rar"这个...通过深入研究这个例子,开发者可以更好地理解和掌握C#中的泛型技术,提升代码质量和效率。
标题:“C#泛型研究”与描述:“C#泛型探究(自学篇)”共同强调了对C#语言中泛型特性的深入探索。...通过深入研究泛型的细节,你可以更好地利用C#的这一特性,创造出更加健壮、高效和易于维护的软件系统。
6. **Java泛型深入研究.doc** 泛型是Java 5引入的特性,允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和重用性。深入学习泛型可以提升编程效率,避免类型转换的麻烦。 7. **JAVA3D学习.doc** Java...
### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型...对于任何希望深入了解Java泛型和设计模式的开发者来说,深入研究并掌握此类工具类的实现原理和应用场景都是一项非常有价值的技能。
这些项目源码对于C#开发者来说是一份很好的学习资料,通过深入研究和实践,不仅可以掌握泛型的使用,还能了解到如何在实际项目中设计和实现泛型类和方法,提升编程技巧和代码质量。因此,无论是初学者还是经验丰富的...
通过深入研究这些实例,你将能更好地理解泛型委托如何增强代码的灵活性,提高代码的可复用性和性能,同时降低出错的可能性。无论你是初学者还是有经验的开发者,这个实例都将有助于你提升在.NET开发中的技能。
在 Delphi 编程语言中,泛型是一种...通过深入研究这个示例,你可以更好地理解如何在自己的项目中利用泛型接口约束来提高代码的可复用性和类型安全性。在实践中,这将有助于你编写出更健壮、更灵活的 Delphi 应用程序。
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储和操作提供了丰富的类库。泛型是Java 5引入的一项创新特性,极大地增强了集合框架...通过深入研究和实践,开发者能够更好地应对复杂的数据处理需求。
在研究泛型DAO的源码时,我们可以学习到如何实现泛型类,以及如何在具体操作中使用反射或类型信息来处理泛型类型。例如,Hibernate的`Session`接口和`SessionFactory`类就提供了泛型版本的`get()`和`load()`方法,...
通过深入研究C#泛型,开发者可以编写出更加灵活、可扩展的代码库,这些代码库能够适应各种不同的数据类型,同时保持高效和易于维护。因此,对于任何希望在C#环境中构建高质量软件的开发者来说,理解和掌握泛型都是不...
对于有了一年Java开发经验的人来说,深入理解并掌握Java泛型的应用是提升编程效率和代码质量的关键。 首先,我们来了解泛型的基本概念。泛型可以看作是模板或者蓝图,它允许我们在编写代码时指定一个或多个类型参数...
本篇将深入探讨C++泛型编程的应用实例,帮助初学者领略其魅力。 首先,我们来看“标准模板库自修教程与参考手册 STL进行C++编程.jpg”。标准模板库(STL)是C++泛型编程的核心组成部分,它包含了一系列容器(如...
**正文** 在本文中,我们将深入探讨如何在Windows ...结合提供的文件,我们可以研究这些项目和代码,深入了解如何在实践中应用这一技术。对于开发者来说,理解和掌握这种技巧将有助于构建更加高效和可维护的WCF服务。
在深入研究开源项目时,了解泛型的使用有助于理解代码逻辑。例如,`ArrayList`的源码中,可以看到泛型是如何应用于数据结构的: ```java public class ArrayList<E> extends AbstractList implements List, Random...
通过深入研究这些示例,你可以更深入地理解泛型的使用场景和优势,提高编程效率,并编写出更加健壮的代码。同时,理解泛型的限制,如不能在泛型类的静态成员中使用类型参数,也是学习泛型的重要部分。 总之,泛型是...
- 对于希望深入了解泛型编程和范畴论的读者来说,本文档提供了一个很好的起点。 - 通过本文档的学习,读者不仅能掌握伴随的基本概念,还能了解到其在编程实践中的具体应用。 综上所述,伴随不仅是一种理论上的构造,更是...