`

Java之泛型(Generic Type)

阅读更多
Java之泛型(Generic Type)


一、背景知识

    在面向对象编程中有四个概念:抽象、封装、继承、多态
   
    这四种编程思想在Java中的体现:
   
    1、抽象:接口(Interface)、抽象类
    2、封装:用权限关键字控制自身属性对外的访问/继承权限:public、protected、default、private
    3、继承:一个类可以继承另一个类的属性或方法。
    4、多态:有继承必然有多态。允许子类重写 (overwrite) 父类中的方法。
             实现多态的条件:继承、重写、向上转型(父类引用子类的对象 [注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







-   
   
   
   
   
   
分享到:
评论

相关推荐

    Java1.5泛型指南中文版

    感谢所有为Java泛型做出贡献的人们,包括设计者、实现者以及提供反馈和支持的社区成员。泛型是Java语言的一个重要特性,极大地提高了代码的质量和可维护性。 以上就是基于给定文件信息对Java 1.5泛型指南的主要知识...

    java泛型数组

    ### Java 泛型数组的理解与应用 #### 一、引言 Java 泛型是 Java SE 5.0 引入的新特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。然而,在 Java 中创建泛型数组却...

    Java-泛型.ppt

    ### Java泛型详解 #### 一、什么是泛型? 在Java中引入泛型之前,开发者通常使用`Object`类型的集合来存储多种不同类型的对象。这种方式虽然灵活,但在使用过程中需要频繁进行类型检查或类型转换,这不仅增加了...

    Java泛型和集合-英文版

    根据提供的文件信息,我们可以确定本书的标题为《Java泛型和集合》(Java Generics and Collections),作者为Maurice Naftalin和Philip Wadler。该书详细介绍了Java中的泛型(Generics)特性以及集合(Collections...

    Java 泛型总结(二):泛型与数组

    Java 泛型总结(二):泛型与数组 Java 中泛型数组的关系确实有些复杂,不允许直接创建泛型数组,本文将分析其中的原因,并总结一些创建泛型数组的方式。 首先,让我们看看数组和泛型的关系。数组相比于 Java ...

    Java 泛型(Generics)使用说明

    环境:Windows XP Professional、JDK 1.6、Ant 1.7 说明:Java泛型的动机是为解决类型转换在编译时不报错的问题。另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明...

    Java泛型学习【转自百度百科】

    Java泛型是Java编程语言中的一个特性,它允许在定义类、接口和方法时使用类型参数,从而增强了代码的重用性、安全性和效率。在Java中,泛型的引入是为了提供编译时类型安全检查,并减少在运行时进行类型转换的需要。...

    Java - Generic

    这篇博文中,我们将深入探讨Java泛型的各个方面。 首先,泛型的基本概念是它允许我们在类、接口和方法中使用类型参数。这些类型参数代表了某种未知的类型,只有在实际使用时才会被具体的类型替换。例如,我们常见的...

    反射处理java泛型_.docx

    总结来说,`ReflectionUtil`工具类提供了一种方便的方式来处理Java泛型和反射操作,包括从`Type`获取`Class`对象,创建对象实例,以及获取泛型参数类型等。在实际开发中,正确、安全地使用反射对于提高代码的灵活性...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    ParameterizedType paramType = (ParameterizedType) genericType; Type[] actualTypeArgs = paramType.getActualTypeArguments(); for (Type type : actualTypeArgs) { // 处理每个实际类型参数 } } ``` 在这...

    Java泛型PPT教案学习.pptx

    Java泛型是JDK 1.5引入的重要特性,它为集合类和其他容器类提供了类型安全的机制。泛型的主要目标是允许在编译时检查类型安全,避免强制类型转换,同时提供更好的性能。 1. **强类型集合类**: 在Java中,集合类如...

    关于java泛型的小测试(wildcard,erasure,covariant,raw type)

    Java泛型是Java编程语言中的一个关键特性,它允许在定义类、接口和方法时指定类型参数,从而增强了代码的类型安全性和重用性。在本小测试中,我们将探讨几个与Java泛型相关的概念:通配符(Wildcards)、消除...

    深入理解java泛型详解

    首先,泛型(Generic type)是一种在定义类、接口或方法时,使用类型参数的方式。类型参数就像是方法的形参,但用于类型而非值。例如,当我们创建一个泛型列表`List&lt;T&gt;`,`T`就是类型参数,代表一个未知的具体类型。...

    Java语言基础入门教程 Java实训教程 10.枚举与泛型 共27页.pptx

    ### Java语言基础入门教程知识点详解 ...枚举和泛型是Java语言中非常重要的两个概念。枚举提供了一种定义固定集合的有效方式,而泛型则提高了代码的灵活性和安全性。掌握这两种特性能够帮助开发者写出更高质量的代码。

    第十三章 泛型程序设计

    - Java泛型在编译后会进行类型擦除,实际运行时所有的泛型信息都会消失。因此,泛型主要用于编译时检查,运行时所有的泛型类和方法都将退化为无参数的原始类型。 6. **泛型与继承** - 泛型类的子类不能改变父类的...

    【java核心技术】泛型设计

    在Java中,常见的泛型标识符包括`T`(代表Type)、`E`(代表Element)、`K`(代表Key)、`V`(代表Value),它们可以自由地用于泛型的定义。 ### 二、泛型定义 1. **泛型类**: 泛型类允许在类的声明中包含一个或...

Global site tag (gtag.js) - Google Analytics