先上百度百科的解释

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

好吧,我知道这如果初次解除泛型直接就懵掉了,这都是些什么???
理解泛型第一步理解类型信息擦除。

1.简单泛型
类型信息擦除,举两个例子

@Test
public void testGeneric() {
List<String> list1 = new ArrayList<String>();
List<Integer> list2 = new ArrayList<Integer>();
System.out.println("list1类型" + list1.getClass());
System.out.println("list2类型" + list2.getClass());
} list1类型class java.util.ArrayList
list2类型class java.util.ArrayList @Test
public void testGeneric1() {
List list = new ArrayList();
list.add("xyz");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i);
System.out.println("name:" + name);
}
} name:xyz
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

这个例子很明显编译阶段没问题,执行阶段挂掉了。
关于这个举个不恰当的例子:鱼和猫不能放到一个篮子里, 放进去没事, 拿出来还想拿到鱼的话,那就是太单纯了。
所以当时就要避免这情况发生,如果篮子里有个猫,就不放往里放鱼,如果有鱼也就让猫远点,这是不是解释了泛型。

具体的看下List接口的定义就了解了。

2.泛型接口

这个就拿上面List接口为例

public interface List<E> extends Collection<E> {...}

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{...}

这样的泛型接口很合适于工厂模式,这个留个坑在这,设计模式我已经放那了,我希望能写完那个系列...(拖延症患者伤不起, 设计模式我绝对写完,给自己点信心,总要有点坚持)

3.泛型方法
      先对泛型方法做一个声明,拥有泛型方法的类可以是泛型类,也可以不是泛型类,其实就是跟类没啥关系喽
就是那句流行的话,你强任你强...

public class GenericTest {
public <T> void printClassInfo(T t) {
System.out.println(t.getClass().getName());
}
} @Test
public void testGeneric2() {
GenericTest genericTest = new GenericTest();
genericTest.printClassInfo("String");
genericTest.printClassInfo(new Integer("123"));
genericTest.printClassInfo(genericTest);
} java.lang.String
java.lang.Integer
com.test.GenericTest

这样一个类既可以传入String Integer 还有自定义的类型 好神奇的方法重载有没有

4.泛型类

public class GenericClass<T> {
public T getObj() {
return obj;
} public void setObj(T obj) {
this.obj = obj;
} private T obj;
} @Test
public void testGeneric3() {
GenericClass genericClassTest = new GenericClass();
genericTest.printClassInfo("String");
genericTest.printClassInfo(new Integer("123"));
genericTest.printClassInfo(genericTest);
} testGeneric

泛型边界
     可以用无界泛型调用的方法, 就是可以用Object调用的方法
不限制边界,那就是Object

Java泛型编程中使用extends关键字指定泛型参数类型的上边界(后面还会讲到使用super关键字指定泛型的下边界),即泛型只能适用于extends关键字后面类或接口的子类。
Java泛型编程的边界可以是多个,使用如<T extends A & B & C>语法来声明,其中只能有一个是类,并且只能是extends后面的第一个为类,其他的均只能为接口(和类/接口中的extends意义不同)。
使用了泛型边界之后,泛型对象就可以使用边界对象中公共的成员变量和方法。

@Test
public void testGeneric4() {
GenerateAnimal dog = new GenerateAnimal(new Dog());
dog.getName();
} public class Dog implements Animal {
@Override
public String getName() {
System.out.println("dog");
return "dog";
}
} public interface Animal {
String getName();
} public class GenerateAnimal<T extends Animal> {
private T t;
GenerateAnimal(T t){
this.t = t;
} public String getName() {
return t.getName();
}
}

泛型通配符

@Test
public void testGeneric5() {
Fruit<String> f1 = new Fruit<>("平凡如我");
Fruit<Integer> f2 = new Fruit<>(77);
Fruit<Double> f3 = new Fruit<>(22.1);
getData(f1);
getData(f2);
getData(f3); // getFruitData(f1); 编译问题
getFruitData(f2);
getFruitData(f3);
} private void getData(Fruit<?> f) {
System.out.println("Fruit :" + f.getData());
} private void getFruitData(Fruit<? extends Number> f) {
System.out.println("Fruit :" + f.getData());
} Fruit :平凡如我
Fruit :77
Fruit :22.1
Fruit :77
Fruit :22.1 @Test
public void testGeneric6() {
Fruit<String> f1 = new Fruit<>("平凡如我");
Fruit<Integer> f2 = new Fruit<>(77);
Fruit<Double> f3 = new Fruit<>(22.1);
//getFruitSupperData(f1); // 编译问题
//getFruitSupperData(f3); // 编译问题
getFruitSupperData(f2); } private void getFruitSupperData(Fruit<? super Integer> f) {
System.out.println("Fruit :" + f.getData());
}

总结

关于泛型这些也差不多了,在我理解,Java是一种强类型语言,而泛型,使参数类型是可变化的,当然上面的例子与泛型的实际应用还差比较远,希望之后能更融会贯通的应用泛型。

Java泛型拾遗的更多相关文章

  1. Java泛型的历史

    为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...

  2. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  3. Java:泛型基础

    泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...

  4. java泛型基础

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法.  Ja ...

  5. 使用java泛型设计通用方法

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...

  6. 关于Java泛型的使用

    在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...

  7. 初识java泛型

    1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...

  8. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

  9. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

随机推荐

  1. html的<a>标签,表单,内嵌框架

      一.  <a>标签 0. 用图片当链接,就是把图片当成链接文字即可 <a href="http://www.baidu.com/" title="跳 ...

  2. UDP与IP分片

    一.引言  UDP是简单的面向数据报的运输层协议.UDP不提供可靠性:它负责把应用程序传给IP层的数据发送出去,不保证能导到目的地. 二.UDP首部  端口号表示发送进程和接受进程.由于IP层已经 ...

  3. windows下安装ubuntu15.04

    本文主要介绍windows下安装ubuntu15.04,对与其他的版本也是适用的.现在要讲的是一种最简单ubuntu的安装方式. 1软件下载 1.磁盘分区工具DiskGenius 2.启动项修改工具E ...

  4. Python3之collections模块

    简介 collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple namedtuple 是一个函数,它用来创建一个自定义的元组对象,并且规定了元组元素的个数 ...

  5. css3 -webkit-filter

    -webkit-filter是css3的一个属性,Webkit率先支持了这几个功能,感觉效果很不错.下面咱们就学习一下filter这个属性吧. 现在规范中支持的效果有: grayscale 灰度   ...

  6. 2016级算法第五次上机-F.ModricWang的水系法术

    1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...

  7. 2016级算法第四次上机-A.Bamboo 和人工zz

    Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pq ...

  8. 用Javac编译Java文件时出现“编码 GBK 的不可映射字符“的error

    前提:JDK版本 >= 1.6会出现编译报错, 1.6前只会是警告 以下是javac的document: 遇到这种情况的原因是: 文件编码格式与编译器编译所选的encoding不同,有非英文字符 ...

  9. Locust源码目录结构及模块作用

    Locust源码目录结构及模块作用如下: 参考文章:https://blog.csdn.net/biheyu828/article/details/84031942

  10. Unity QualitySettings.vSyncCount 垂直同步数

    QualitySettings.vSyncCount 垂直同步数 Description 描述 The VSync Count. 垂直同步数. The number of VSyncs that sh ...