泛型在jdk1.5出来的,以为自己很理解它了,至少看看代码,写写基本的没有问题。
由于是个新事物,对于我这种从jdk1.1过来的人来说还是一个思维上的跳跃。最近写了一些代码,好好整理了一下。
为什么会出现泛型
我喜欢事事问为什么,要不然就觉得心里不踏实。
我已经不止一次的提到过,任何的新技术的出现都是伴随着解决一个问题来的。
那泛型解决了什么?
我们记得在以前的编码过程中,exception中无非就那几种是比较常见和头疼的。第一大非NullPointerException莫属了,我就不多说了,接着就是ClassCastException,因为我们的代码中往往为了所谓的扩展性(可能是过度设计产生的),用了很多Object类作为参数输入,没有泛型之前,我们的处理方法是到处用强制转换,如果保险点就加很多的instanceof.所以这个Class类型匹配要多烦有多烦。
好了,泛型来了,它的最大特点就是要规范你的编码风格,不允许你乱定义你的类型,用错了就编译不过,不用就给你一个警告,哈哈。
总之,泛型的作用就是使代码得到的信号类型一致,从而使行为一致。
怎么要使用泛型
泛型分为两步:申明 + 使用
申明:两个个地方可以申明,类定义中申明,方法定义申明。(有人提出三个地方,接口定义,但是我想接口也是类嘛)
为什么就这两个地方?有什么好处?
如下类定义中申明了一个T类型,这样就可以在这个类中的任何地方用这个T作为类型,就像一辆车,框架有了,但是什么材料做的不知道,可以是铁的,也可以是铝的,所以我们就用”材料T“
来代替材料类型。
public class Car<T extends Metal>{}
那怎么使用这个材料T泛型呢?如果我们new Car的时候不指定材料T的具体,是无法造出汽车的,巧妇难为无米之炊啊。所以我们使用泛型的时候就需要具体化它。
public class Fe extends Metal{}
public class Al extends Metal{}
Car<Fe> car1=new Car<Fe>();
Car<Al> car2=new Car<Al>();
这样车车就造出来了,很酷吧?
但是上述有个不爽的地方就是,每次造车的时候必须告诉它是什么材质的,但是有时候我们根本不关心材质的情况下,就显得多余了。比如我要知道每一种车的颜色而不是材质。如果我们按照上述的类申明的泛型,那么可以在class定义后面加个颜色S的泛型(支持逗号),但是如果下次不要颜色,要尺寸,我是不是还要加个尺寸泛型M?
是不是很多啊,所以我想除了一些基本的类型外,其他局部的特性就不用放在类申明里面了,可以放在方法申明里面,怎么做呢?请看
public class Car{
public <S extends Color> S getColor(){
}
public <S extends Color> void setColor(S s){
}
}
其中的S是专属于方法的,这个方法还可以是static的。
那怎么使用呢?很简单,如下:
public class Red extends Color{}
Car car3=new Car();
car3.setColor(new Red());
核心思想
说了这么多,我想泛型的核心思想就是规范类和方法的行为。只要两个类或者方法有相同的逻辑,哪怕是一点点相像的地方,我们都可以用一个泛型定义来申明它,这样就使得代码十分简洁安全。
在这里我要提一下复杂关系情况下的泛型。因为任何技术总是原理简单,到复杂环境下就丧失理智,摸不着头脑。
举个例子:父母--子女--性别
父母有子女,子女有性别
如果不用泛型,我们会分别对男孩,女孩分别写逻辑和类。
比如:
public static class Gender{}
public static class Male extends Gender{}
public static class Female extends Gender{}
public static class Child{
public Gender gender;
}
public static class Boy extends Child{}
public static class Girl extends Child{}
public static class Father{
private Child child;
public Boy getBoy(){
return (Boy) child;
}
public Girl getGirl(){
return (Girl) child;
}
public void setBoy(Boy boy){
this.child=boy;
}
public void setGirl(Girl girl){
this.child=girl;
}
}
是不是觉得两个get/set方法结构一样,但是非要实现,而且方法名字必须不一样,因为类重载不能以返回值来区分。
如果用泛型,就简单清晰了。
首先申明:
public interface Child<G> {}
指定child,但是性别不知道,所以用了“性别G”来代替
接着
public class Father<C extends Child<?>> {
private List<C> children = new ArrayList<C>();
public void addChild(C c) {
this.children.add(c);
}
public List<C> getChildren() {
return this.children;
}
}
指定了father,但是不知道子女是男孩还是女孩,所以用了"孩子C"来代替,并且extends Child,意思是至少我知道是个孩子,孩子里面还有个?号,意思是我知道是个孩子,但是我不知道孩子是男是女。
好了,申明好了,接着我们就开始用了。
Father<Boy> father1=new Father<Boy>();
Father<Girl> father2=new Father<Girl>();
father1.addChild(new Boy());
father2.addChild(new Girl());
是不是很简洁?
这就是面向对象语言的魅力。
分享到:
相关推荐
"Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...
泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。...理解和熟练使用泛型是Java开发者必备的技能之一。
Java基础入门系列是帮助初学者掌握Java编程的重要学习材料,本篇主要介绍了泛型、反射和注解这三大高级特性。 泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型...
总结,Java基础泛型的学习涵盖了类型参数、泛型类、方法和接口,以及边界、类型擦除、多态和集合的使用等多个方面。理解并熟练运用泛型,可以显著提升代码的质量和可维护性。在实际开发中,特别是在处理数据结构如...
JAVA学习是每位初学者步入编程世界的关键步骤,尤其对于非计算机专业的学习者来说,掌握基础知识尤为重要。本笔记主要涵盖了数据基础和泛型编程两大主题,同时也涉及到类和对象、数据类型、类的初始化和加载以及单例...
学习这部分内容对于Java开发者至关重要,因为理解并熟练掌握Java集合框架和泛型,能有效地提升代码质量和效率,减少运行时错误。此外,了解枚举类型有助于编写更安全、更整洁的代码。通过深入研究和实践,开发者能够...
Java基础知识学习教程-9集合与泛型 Java集合框架是Java语言中的一种数据结构,用于存储和操作数据。集合框架提供了多种类型的集合,包括Collection、Set、List、Queue、Map等。这些集合类型都继承自Collection接口...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
通过学习这些知识点,开发者能更好地理解Java泛型的内部原理,以及如何在实际项目中充分利用泛型的特性,提高代码质量和安全性。在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java...
Java 1.5 泛型指南中文版 本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数...是 Java 开发者学习泛型的重要参考资料。
### 泛型基础知识与应用详解 #### 泛型概述 泛型是Java语言的一个重要特性,它主要解决了在集合框架中频繁出现的类型转换问题,同时也增强了类型安全性。泛型的概念最早出现在Java 5.0版本中,它允许开发者创建能够...
Java基础学习课件PPT是一套全面覆盖Java SE(标准版)基础知识的教育资源,适合初学者和希望巩固Java技能的开发者。这套课件旨在在一个月内帮助学习者掌握Java编程的核心概念,为深入学习和应用Java技术打下坚实的...
Java泛型和集合是Java编程语言中的核心特性,它们极大地提高了代码的类型安全性和可读性,同时也简化了集合操作...通过深入学习这本书籍,开发者可以更好地掌握Java泛型和集合的精髓,从而编写出更安全、更高效的代码。
Java 泛型构造函数是Java编程中用于增强类型安全性的工具,它们允许我们在类的构造函数中使用类型参数。在创建对象时,泛型构造函数能够确保传入的数据类型符合预定义的约束,从而减少类型转换错误并提高代码的...
适用人群:适用于具有一定Java编程基础的学习者和开发者,特别推荐给希望深入了解Java核心技术的专业人士。 使用场景及目标:本文旨在提升读者对于Java中枚举和泛型的理解与应用能力,包括掌握如何高效地定义和使用...
1. **基础语法**:Java的基础语法是学习任何编程语言的起点。这包括变量声明、数据类型(如整型、浮点型、字符型和布尔型)、运算符(算术、比较、逻辑等)、流程控制(如if语句、switch语句、for循环、while循环)...
【Java 泛型】是Java编程语言中一个强大的...总之,这个压缩包包含的内容涉及了Java泛型、Java Web开发基础、以及现代Web应用中数据存储的几种方式,对于深入理解和实践Java编程,尤其是后端开发有着重要的参考价值。
### Java 1.5 泛型指南中文版知识点解析 #### 1. 引言 在Java 1.5中引入的泛型是一种强大的类型安全机制,它允许开发者...这些知识点涵盖了从基础到高级的泛型使用技巧,对于学习和应用Java泛型具有重要的指导意义。
思维导图