Java之泛型(Generic Type)

Java之泛型(Generic Type)


一、背景知识

    在面向对象编程中有四个概念:抽象、封装、继承、多态
   
    这四种编程思想在Java中的体现:
   
    1、抽象:接口(Interface)、抽象类
    2、封装:用权限关键字控制自身属性对外的访问/继承权限:public、protected、default、private
    3、继承:一个类可以继承另一个类的属性或方法。
    4、多态:有继承必然有多态。允许子类重写 (overwrite) 父类中的方法。
             实现多态的条件:继承、重写、向上转型(父类引用子类的对象 [注1])。
   
    注1:
    ①父类引用子类的对象,只能引用到父类中定义的属性或方法(可能已经被子类重写)。
      不能引用到子类自己定义的属性和方法。
   
    ②子类引用子类对象时,子类则可以调用父类的方法。
   



二、"模板与解释器"思想
       
    Java语言需要编译生成.class文件后才能执行。
    所以真正在内存中运行的代码是经过编译后的.class文件。
   
    我们写的.java 文件其实是解释器要进行编译的模板。
    那么我们就可以对模板进行各种标注。   
    Java 的注解(annotation)就是这种"模板"思想的典型应用。
   
    为了让代码更加灵活,Java还提供了可以引用 meta-data 的功能。
    什么是 meta-data?就是描述数据的数据。
    Java在这方面的应用的体现就是:反射(reflection)、泛型(Generic Type)

    利用反射(reflection),我们可以不通过使用new关键字对类产生一个对象来调用类的方法,
    而是直接 invoke 一个类的方法。这种思想可以应用为 “面向切面编程”:
    可以不通过修改源代码而对源代码的方法在其执行前后增加新的逻辑。(如:日志监控,权限判断)

   
   
三、泛型的起源
   
    Java 在JDK1.5 中新增了泛型的功能。
 
    根据《Java编程思想 (第4版)》中的描述,泛型出现的动机在于:
   
        泛型出现的最引人注目的一个原因就是为了创建容器类。
       
    我们经常看到这样的写法:
   
    ArrayList<String> list = new ArrayList<String>();
   
    上述写法告诉编译器:这是一个 String 类型的 list。
    只能装载 String 类型的数据。装载别的类型的数据会报错。

   
四、泛型的定义

    类的类型的参数化,就是泛型。
    或者说:
    类的类型也可以作为参数变量传递给类或类的方法。
   
    什么?又多了一种参数形式?是的。
   
    我们知道Java中的方法(method)使用小括号声明参数。   
    Java中使用尖括号 <> 声明一个泛型。
   
   
五、泛型的含义
   
    不同的类其泛型所代表的含义不同。
    根据类的实现方法,看泛型所代表的具体含义。
   

六、泛型的实现方法

    1、定义泛型
    Java在类或类的方法声明中可以声明一个泛型。多个参数时用逗号隔开。
    泛型的声明需要写在类名之后或方法的返回值之前。
   
   
    泛型的声明,写在类名之后:

    public class Student<T>{
        
    }

   
    泛型的声明,写在方法的返回值之前:
    public static <K,V> void update (K k, V v){
        
    }

   
    这里说明一下:
   
        1)、为了便于阅读,你会看到在Java中有人使用 T E K V 等字母。
             这些对编译器来说都是一样的,可以是任意字母。
            T : Type (类型)
            E :  Element(元素)
            K : Key(键)
            V : Value(值)
       
        2)、泛型的类型参数只能是引用类型,
             不能是原始类型(int,char,double,long等)。
   
   
    2、?通配符:表示任意类型   
    List<?> barList;
    
    3、?通配符的扩展
   
    1) 限定上边界:
    extends 关键字:表示该类型必须继承了某类
    public <T extends Comparable<T>> T maximum(T x, T y, T z){
        
    }

   
    2) 限定下边界   
    super 关键字:表示该类型必须是某类型的父类
    public class Student<? super Integer>{
    
    }

   
   
   
七、Java中泛型的形态

    1、泛型接口
   
    public interface Calculator<T> {
        public T getNumber();
    }
    
    public class NumberCalculator implements Calculator<Number> {
        @Override
        public Number getNumber(){
            return Math.random();
        }
    }

   
    2、泛型类
   
    public class Mapper<K, V> {
        private K key;
        private V value;

        public Mapper(K k, V v) {
            key = k;
            value = v;
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }

   
   
    3、泛型方法
   
   
    public class Printer {

        public static <T> void print(T t) {
            System.out.println(t);
        }
        
        public static <T> void print(T... args) {
            for (T t : args) {
                System.out.println(t);
            }
        }

        public static void main(String[] args) {
            print("Hello, World!");
            print('a');
            print(123);
            print(34.5);
            print(true);
            
            print("Hello, World!",'a', 12, 34.45, true);
        }
    }

   
   
   
   
   
   
   
   
-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/2323917







-   
   
   
   
   
   

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Java集合 - 2016-09-13 14:09:09

Map ConcurrentHashMap HashMap LinkedHashMap Hashtable WeakHashMap   Set HashSet LinkedHashSet TreeSet   List ArrayList LinkedList
Java 程序的三种结构 一、 顺序结构     从上往下逐行执行,每句必走。 二、 分支结构     有条件的执行某语句,并非每句必走。 1)if 结构 :1 条路 if(boolean 表达式 ){   语句块 } 若语句块仅有一条语句,可以省略“ {} ”。 2)if...else 结构 :2 条路     3)if...else if 结构 : 多条路 4)switch...case 结构 : 多条路 在 JDK1.6 及其以前版本中 switch 语句中的表达式的值必须是整型和字符型,在 JDK

阴影文字 - 2016-09-12 14:09:37

最近写了一段阴影文字的代码 /*   dkplus专业搜集和编写实用电脑软件教程,搜集各种软件资源和计算机周边(java网络编程、seo网站优化、web开发,lnmp,java网络编程,毕业论文设计),独立制作视频和ppt和音频微信公众号,点击进入 dkplus官方博客http://dkplus.iteye.com 微信搜索dkplus关注公众号可获取海量计算机周边资源。   */    import  java.awt.*;   import  java.applet.*;   import  java

第二篇 - 2016-09-12 14:09:36

现在使用最多的编程语言是什么?? 当然是JAVA

java面试必备之类和对象 - 2016-09-12 14:09:37

               Java 类和对象( 都是重点,必须理清楚 ) 一、 类和对象    1. 什么是类 ? 什么是对象 ?   1) 现实世界是由很多对象组成的,基于对象抽出了类   2) 对象 : 真实存在的单个的个体,类 : 类型 / 类别,一类个体   3) 类中可以包含 :     3.1) 所有对象所共有的特征 / 属性 ( 静 )---- 变量     3.2) 所有对象所共有的行为 ( 动 )--------- 方法   4) 一个类可以创建多个对象     同一个类的多个对象,

我的私房IT图书馆 - 2016-09-12 14:09:08

         工作十年,家中珍藏了不少经典的IT图书,现整理成册,分享给大家,希望大家有所借鉴,有所帮助。   Java类 书名 简介 疯狂Java讲义(第3版) 案例驱动,引爆编程激情。再现李刚老师课堂氛围。注释详细,轻松上手。  Java从入门到精通(第2版)  零基础、入门级的讲解。超多、实用、专业的范例和项目。随时检测自己的学习成果。细致入微、贴心提示。  Java典型模块与项目实战大全  覆盖Java语言6大技术要点,详解Java语法的最新特性,精选25个典型模块和4个项目案例,实战Java

Spring架构揭秘-声明式事务 - 2016-09-12 14:09:39

1、声明式事务原理 2、Spring事务模块结构及解析   一、声明式事务原理      在日常的开发中经常会使用到事务,比如在新增纪录的方法里,通常会先开启事务,然后再提交事务,遇到异常就回滚事务,事务代码都是模版型的,写起来很烦,但是又不能不写。这正好符合AOP的应用范围,Spring天然的支持AOP,于是伟大的声明式事务就这么诞生了。通过XML或注解的方式配置事务,标明在哪个类,那个方法需要使用事务即可。 二、Spring事务模块结构及解析      Spring对事务管理做了高级抽象,分为3个部分

Maven 项目SuchNoMethod等报错 - 2016-09-12 14:09:16

对于maven项目经常会出现,项目引入一堆依赖,最后项目运行的时候出现 NoSuchMethod ClassNotFound NoClassDefFound 这些exception,这个时候就要怀疑是不是引包的姿势不对,导致了项目启动出现问题! Root Cause: 一般出现以上exception的根本原因是,a,b不同的依赖之间依赖了同一个依赖c的不同版本,在A版本中某个类还在,但是在B版本中对应的类已经被删除了,maven依赖的时候根据自身的规则依赖了B版本,导致了应用在调用a的方法时,出现了NoSu
1、鼠标右击我的电脑(计算机)-----------属性-----------高级系统设置-----------环境变量-----------新建     2、分别配置以下环境变量: 环境变量名     环境变量值 PATH              C:\Java\jdk1.6.0_30\bin CLASSPATH       .; JAVA_HOME( 供第三方插件用 )C:\Java\jdk1.6.0_30\ (注意:以上环境变量值的符号都是在英文输入法状态下,建议环境变量新建在Administra

Java传统IO - 2016-09-12 14:09:12

传统IO有两种形式,一种是阻塞IO,另一种是阻塞IO+每个请求创建线程/线程池。 阻塞IO IO的阻塞、非阻塞主要表现在一个IO操作过程中,如果有些操作很慢,比如读操作时需要准备数据,那么当前IO进程是否等待操作完成,还是得知暂时不能操作后先去做别的事情?一直等待下去,什么事也不做直到完成,这就是阻塞。抽空做些别的事情,这是非阻塞。 在传统IO里,InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超时)才会返回;同样,在网络IO运用中调用ServerSocket.accept(