写这个博文的目的:1.校验自己的学习成果的不足,与错误的地方(大牛么看到指正一下)。
2.与整天忙于coding的没留意过泛型的同志们一起学习。
废话:
Java泛型与C++的模板十分类似,感觉JAVA跟C++就是一个原理,大学时着两门语言都看过,感觉JAVA就是C++的简洁版C=>C++=>Java依次进化,逻辑的实现编程越来越简单,
Java一直承诺是面向对象的编程,在刚学习java时这个给我的印象十分深刻,看了Java泛型设计后,感觉是java那帮人抛弃了自己的诺言,变成了为了实现编程而进行编程,又回到当时学C时的感觉了。
自己也很水,平时也不怎么使用泛型,用的最多的就是别人写好的,呵呵。
下面写一下自己学习泛型的理解,正在给自己充电各种学习,有不对或不全的地方欢迎大家指正。
一、泛型的使用场景
我感觉泛型主要用于2方面
1.JAVA提供的各种容器 比如List Map Set 等
2.大家在编程中各种操作对象实体的动态生成
比如:产生Service Dao的实体操作对象代码中可能会有getService(); getDao()等
二、泛型的作用
1.减少重复模式代码的编写。
2.控制类型的安全,这个在JAVA容器中体现较为直观。
三、泛型类的定义
:一个泛型类就是具有一个或多个类型变量的类。
例:public class Pair<T>{
private T first;
private T second;
public Pair(){firs= null; second = null;}
public Pair(T first,T second){ this.first = .......}
public T getFirst(){return first;}
pubic T getSecond(){return second;}
public void setFirst(T fisrt){......}
public void setSecond(T second){......}
}
T 就是Pair类的类型变量,用具体的类型替换类型变量就可以实例化泛型类型,比如Pair<String>
Pair(String first,String second)
这时调用getFirst()/getSecond()返回的都是String类型。
可以把泛型看成产生普通类的一种方式,比如几种类型都用到了Pair类
比如 Pari<Integer>,Pair<String>用T变量来分别代表String,Integer就减少了这个中类型模式下的重复代码。
类型安全:不恰当的比喻是Pair没有T泛型时,我们给Pair初始化放入值后,分别放入String变量值与Integer变量值,当我们用String xxx = pair.getFirst(); String xxxx = getSecond();时其中有一个是Integer类型强转肯定汇报错,加上泛型时:就限定了他们两个必须是同一个类型,当时不同类型时是放入不进去的会报错。
说的有点绕,恰当点的就是容器中的限定比如List<String> 结果你放入一个Integer肯定是不行的。
泛型可以引入多个变量比如 public class Pari<T,V>{......} T和V分别限定了不同的类型的泛型。
跟上面说的一样,大家可以试试就是 T first;V second;
四、泛型方法的定义
class ArrayAlg{
public static <T> T getMiddle<T[] a>{
return a[a.length/2];}
}
<T> T : <T> 是类型变量,T是返回类型。
String[] names = {"11","22","33"};
String middle = ArrayAlg.<String>getMiddle(names);
String middle = ArrayAlg.getMiddle(names);
这两种取值方式都是正确的,因为参数类型与返回类型都是T 所以当指定了参数类型时,就已经传入了类型变量。
泛型方法的普通项目中用的最多的:
public <T> T getObject(Class<T> c){
T t = c.newinstance(); return t;
}
五、类型变量的限定约束
限定约束类型变量T,一般是由于泛型方法,或泛型类中指定了特定的实现,而这种特定的实现,并不是所有普通类都具有,可能是只有实现了特定接口的类才能够使用这种泛型类,这就是类型变量T的范围限定。
比如:泛型方法中逻辑实现使用了compare方法,不是所有的Java类型都有compare方法,为了防止出现异常,在类型变量T加以限定 <T extends Comparable>
指定了送入的类型变量T必须是实现了Comparable接口的类型。
<T extends Comparable&Serializable&...> T 可以被多个接口限定,如果限定中有一个类,那么这个类必须是extens后面的第一个,
关于泛型造成的多态的混乱大家可以网上搜一下,及解决方法
泛型最好不要使用instanceof类型判断 因为 a instanceof Pair<String> 与a instanceof Pair<T> 都返回true
六、通配符 Pair<? super xxxx>
extends是用父类限定子类的类型,super是用子类来说明父类,我感觉这样很难理解 只能说明存在这种关系,而且如果是接口的话那么?代表的接口类型也是比较宽泛的
我是这样理解的 <? super xx> a类型 obj实例
<? extends xxx> b类型 obj实例
a 用于给obj赋值调用setMethod
b 用于obj中取值调用getMethod
分开理解
当xx 表示Manager xxx表示Employee时
Pair<Manager> getMethod 可以返回Employee,Pair<Employee>中的set方法可以设置Employee的任何子类,反过来则不行。
分开理解,这是两种类型,放在一起就混了,一个取值一个用,一个放值用。也就是为了实现不同功能的限定
不正确或不足的地方,大家指正!!
相关推荐
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
java泛型详细学习,深入学习java的不二之选
泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。泛型的主要目标是增强类型安全,避免在运行时出现...
泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类<元素类型>, 添加元素...
在Java泛型出现之前,集合框架中的类如`List`、`Map`等都是以`Object`作为类型处理元素的。这意味着在使用这些集合时,往往需要频繁地进行类型转换操作,如: ```java List list = new ArrayList(); list.add("hello...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
10. **泛型**:讨论Java泛型的使用,如何编写类型安全的代码,并理解其类型擦除的原理。 11. **枚举与注解**:介绍Java中的枚举类型及其用法,以及注解的定义和应用,它们在现代Java开发中有着广泛的应用。 12. **...
本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、Class Literals as Run-...
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
此外,《JAVA学习笔记》还涵盖了集合框架,包括ArrayList、LinkedList、HashSet、HashMap等各种集合类的使用,以及泛型、迭代器和流API的应用。这些内容对于处理数据和实现复杂算法至关重要。 对于多线程编程,书中...
这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...