1.概念

  泛型就是参数化类型。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

2.案例

1)先看下面案例:

//不适用泛型编程
Apple app0=new Apple();
Apple app1=new Apple();

List li = new ArrayList();
li.add(app0);        //添加非需要类型时发现不了错误。
li.add(app1);

Apple appUsed=(Apple)li.get(0);

//使用泛型编程如下
Apple app0=new Apple();
Apple app1=new Apple();

List<Apple> li = new ArrayList<Apple>();
li.add(app0);        //如果添加的对象类型错误,编译器即可发现。指定容器要持有的对象类型,用编译器来保证类型的正确性。
li.add(app1);

Apple appUsed=li.get(0);

使用泛型的优点:大型应用时能显著降低程序的复杂度;泛型为较大的优化带来可能: 可以在编译期发现该类错误,而且在取出元素时不需要再进行类型判断,从而提高了程序的运行时效率。

2)泛型类

有两个类如下,要构造两个类的对象,并打印出各自的成员x。

 public class StringFoo {

     private String x;

     public StringFoo(String x) {
              this.x = x;
     }

     public String getX() {
              return x;
     }

      public void setX(String x) {
              this.x = x;
     }
  }

  public class DoubleFoo {

     private Double x;

     public DoubleFoo(Double x) {
              this.x = x;
     }

     public Double getX() {
              return x;
     }

      public void setX(Double x) {
              this.x = x;
     }
  }

用泛型来实现

public class GenericsFoo<T> {

  private T x;

  public GenericsFoo(T x) {
     this.x = x;
  }

   public T getX() {
     return x;
  }

  public void setX(T x) {
     this.x = x;
  }
}

代码实现:

 public class GenericsFooDemo {

  public static void main(String args[]){

     GenericsFoo<String> strFoo=new GenericsFoo<String>("Hello Generics!");
     GenericsFoo<Double> douFoo=new GenericsFoo<Double>(new Double("33"));
     GenericsFoo<Object> objFoo=new GenericsFoo<Object>(new Object());

     System.out.println("strFoo.getX="+strFoo.getX());
     System.out.println("douFoo.getX="+douFoo.getX());
     System.out.println("objFoo.getX="+objFoo.getX());
  }
}

3)泛型方法

是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法,只需将泛型参数列表置于返回值前。

public class ExampleA {

  public <T> void f(T x) {
     System.out.println(x.getClass().getName());
  }

  public static void main(String[] args) {

     ExampleA ea = new ExampleA();

     ea.f("ea ");
     ea.f(10);
     ea.f('a');
  }
}

  使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。需要注意,一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。

4)限制泛型和通配符

class GenericsFoo<T extends Collection>,这样类中的泛型T只能是Collection接口的实现类,传入非Collection接口编译会出错。

class GenericsFoo<? extends Collection>,“?”代表未知类型(通配符),这个类型是实现Collection接口。<? extends 类型>表示这个类型是某个类型的子类型。

  使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。需要注意,一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。

4)限制泛型和通配符

class GenericsFoo<T extends Collection>,这样类中的泛型T只能是Collection接口的实现类,传入非Collection接口编译会出错。

class GenericsFoo<? extends Collection>,“?”代表未知类型(通配符),这个类型是实现Collection接口。<? extends 类型>表示这个类型是某个类型的子类型。

Java之泛型编程的更多相关文章

  1. java泛型编程

    一般的类和方法都是针对特定数据类型的,当写一个对多种数据类型都适用的类和方法时就需要使用泛型编程,java的泛型编程类似于C++中的模板,即一种参数化类型的编程方法,具体地说就是将和数据类型相关的信息 ...

  2. Java向下转型的意义

    一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向 ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php

    atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php \ 1. 泛型历史 1 由来 1 2. 泛型的机制编辑 1 机制 1 编译机制 2 3. 泛型方法定义1::前定义 ...

  5. Java面向对象程序设计--泛型编程

    1. 为何要进行泛型编程? 泛型变成为不同类型集合提供相同的代码!省去了为不同类型而设计不同代码的麻烦! 2. 一个简单泛型类的定义: public class PairTest1 { public ...

  6. JAVA泛型编程笔记

    1介绍 Java泛型编程是JDK1.5版本后引入的.泛型让编程人员能够使用类型抽象,通常用于集合里面. 下面是一个不用泛型例子: List myIntList=new LinkedList(); // ...

  7. 初学java之12 泛型编程的个人理解总结

    首先,强调一个观点: 对于我这样的初学者,一定要站在虚拟机和编译器的角度来分析java 语言的种种特性,泛型也不例外.(我认为这个一条正确的学习经验) 写这篇文章起源于最近在学java,有一天在路上和 ...

  8. java 泛型编程学习

    先发布,以后有空再修改... 第一次看到<java核心技术卷一>中关于泛型这部分的时候感觉很复杂,似乎有说不完的约束条件,让人难以理解.当时只是囫囵吞枣般过了一遍,也没有看出个什么来.现在 ...

  9. Java 经典入门(一)

    一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...

随机推荐

  1. C语言程序设计第一次作业 冯亚杰

    (一)实验总结 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=7 运行结果: 测试数据2:r=5 运行结果: (4)实验分析 ...

  2. 初探nginx

    nginx nginx是俄罗斯人写的轻量级http服务器,Nginx 以事件驱动的方式编写,有非常好的性能,同时也是一个非常高效的反向代理.负载均衡. Nginx 稳定性高,模块库丰富,配置灵活,系统 ...

  3. VS生成项目时,有些文件无法复制到输出目录的解决办法

    有时候,我们在生成项目时,发现有些文件如:.jpg的图片文件,无法复制到输出目录中,此时会非常纠结,反复的清理项目,重新生成,依旧不能解决此问题.后来我打开.csproj的项目工程文件时,经过对比发现 ...

  4. c# 判断datatable中是否存在某列

    if (datatable.columns.contains("要找的列名"))

  5. RestTemplate的异常:Not enough variables available to expand

    原因:RestTemplate使用出错,我的情况是不知道这里要求用RestTemplate的使用格式,应该很多人都是这样吧?不过,看了下RestTemplate,感觉其实还是很好用的. RestTem ...

  6. Intellij Error:Cannot build Artifact 'XXX:war exploded' because it is included into a circular dependency

    外网的流程是这样的. 1: 2: 3: 4: 基本按这个来就好了 如果到了build artfact哪里按钮是灰色 就要手动建了 https://jingyan.baidu.com/album/0a5 ...

  7. KMP算法小结

    最近看了一些关于KMP算法的资料,在此写一篇博客总计一下. 1.KMP算法介绍 KMP算法是一种字符串搜索的改进算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称 ...

  8. 628. Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  9. 浅谈static其一之不死变量

    在学习汇编的过程中,小有所悟,遂把自己所思所想记下,以便日后查阅. 首先说说我对这个关键字的理解.static字面上就是静止的.静态的.不变的之类的意思,所以在被它修饰之后,应该也会带有这样的一些特点 ...

  10. 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)

    为了日后便于查询,本文所涉及到的必记的基本字符串方法如下: "分隔符".join(字符串)    #将字符串的每一个元素按照指定分隔符进行拼接.split("字符串&qu ...