`

java泛型详细解析

    博客分类:
  • JAVA
 
阅读更多
转自:http://javaee.h.baike.com/article-307334.html

泛型(Generic)
一、泛型的作用
        JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。

       注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的 java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
泛形的基本术语,以ArrayList<E>为例:<>念着typeof
                           ArrayList<E>中的E称为类型参数变量
                           ArrayList<Integer>中的Integer称为实际类型参数
                           整个称为ArrayList<E>泛型类型
                           整个ArrayList<Integer>称为参数化的类型ParameterizedType
二、泛型典型应用
使用迭代器迭代泛形集合中的元素。

    public void test1(){
        List<String> list=new ArrayList<String>();
        list.add("wang");
        list.add("hai");
        list.add("yan");
        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            String value=it.next();
            System.out.print(value);
        }
    }
使用增强for循环迭代泛形集合中的元素。
public void test2(){
        Map<Integer,String> map=new HashMap<Integer,String>();
        map.put(1, "wang");
        map.put(2, "liu");
        map.put(3, "meng");
        Set<Map.Entry<Integer, String>> entries=map.entrySet();
        for(Map.Entry<Integer, String> entry:entries){
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
}
存取HashMap中的元素。
    public void test3(){
        Map<Integer,String> map=new HashMap<Integer,String>();
        map.put(1, "wang");
        map.put(2, "liu");
        map.put(3, "meng");    
        Set<Integer> keys=map.keySet();
        Iterator<Integer> it=keys.iterator();
        while(it.hasNext()){
            int key=it.next();
            System.out.println(key+"   "+map.get(key));
        }
    }
使用泛形时的几个常见问题:
使用泛形时,泛形类型须为引用类型,不能是基本数据类型
三、自定义泛形——泛型方法
       Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例如:
       public static <T> void doxx(T t);
四、练习
1.编写一个泛形方法,实现数组元素的交换
public static<T> void test1(T arr[],int i,int j){
        T temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
}

public static void main(String[] args) {
        Integer arr[]={1,2,3,4};
        test1(arr,0,2);
        for(int ar:arr){
            System.out.println(ar);
        }
}
2.编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素
public static<T> void test2(T arr[]){
        int startindex=0;
        int endindex=arr.length-1;
        for(;;){
            if(startindex>=endindex){
                break;
            }
            T temp=arr[startindex];
            arr[startindex]=arr[endindex];
            arr[endindex]=temp;
            startindex++;
            endindex--;
             }
}
public static void main(String[] args) {
        Integer arr[]={1,2,3,4};
        test2(arr);
        for(int ar:arr){
            System.out.println(ar);
        }
}
3、补充(将两个数字交换不设中间变量)
public static void testChange(){
        int i=1000;
        int j=1020;
        i=i^j;
        j=i^j;
        i=i^j;
        System.out.println(i+"    "+j);
}
public static void main(String[] args) {
        testChange();
}
五、注意
只有对象类型才能作为泛型方法的实际参数。
在泛型中可以同时有多个类型,例如:

        public static <K,V> V getValue(K key) { return map.get(key);}

如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:
    public class GenericDao<T> {
        private T field1;
        public void save(T obj){}
        public T getId(int id){}
    }

六: 静态方法不能使用类定义的泛型,而应单独定义泛型

五和六极为重要.

七:相对于五,如果有方法的返回是不同于类上的T的泛型,要重新声明.参考三.

分享到:
评论

相关推荐

    Java泛型的用法及T.class的获取过程解析

    本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中引入的一种新的语言特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。泛型可以应用于类、...

    Java泛型擦除深度解析:原理、影响与编程实践

    Java泛型是Java 5中引入的一项重要特性,它为编译时类型安全提供了支持。然而,Java泛型的实现机制——类型擦除,也带来了一系列的问题和限制。本文将深入探讨Java泛型擦除的工作原理、它对编程的影响,以及在实际...

    Java泛型的深度解析:原理、应用与最佳实践

    Java泛型是Java 5中引入的一项强大特性,它允许在编译时提供类型安全,同时提高代码的重用性和可读性。泛型的本质是参数化类型,即在类、接口和方法中使用类型作为参数。本文将深入探讨Java泛型的工作原理、应用场景...

    java泛型指南 经典

    ### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...

    解析Java泛型的类型擦除.pdf

    解析Java泛型的类型擦除 Java 泛型是 Java SE 1.5 的新特性,它们在语法和应用环境上与 C++ 中的模板相似,但是本质上它们之间有着区别,这种区别就在于 Java 泛型的类型擦除。 Java 泛型的类型擦除是 Java 语言...

    Java泛型设计及其PECS原则解析

    内容概要:本文详细介绍了Java泛型的起源、特性、应用场景及限制。重点讲解了PECS(Producer extends Consumer super)原则及其在实际编码中的重要性和应用。通过具体示例阐述了泛型的引入对代码安全性的提升和...

    Java泛型深入解析:灵活编程与类型安全的结合

    Java泛型是一种强大的工具,它提供了类型安全和代码重用性。通过使用泛型,我们可以编写出更加灵活和安全的代码。理解泛型的基本概念、类型参数、泛型类、泛型接口和泛型方法,可以帮助我们更好地利用Java泛型的特性...

    全面总结Java泛型--实例

    标题与描述均提到了“全面总结Java泛型--实例”,这表明文章旨在深入解析Java泛型的概念,并通过具体示例来展示其应用。Java泛型是Java编程语言的一个强大特性,它允许在编译时检查类型安全,并且所有的强制转换都是...

    Java泛型深入解析:类型安全的灵活编程

    Java泛型是一个强大的特性,它提供了类型安全的集合操作和代码重用性。通过理解泛型的工作原理和高级特性,开发者可以编写出更安全、更灵活的代码。尽管泛型有一些限制,但它仍然是现代Java编程中不可或缺的一部分。

    重新理解Java泛型

    本文旨在深入解析Java泛型的各个方面,帮助开发者形成全面、清晰的理解。 1. **泛型基础** - **泛型类**:泛型类是在类定义时引入类型参数的,如`Box&lt;T&gt;`中的`T`,它代表一个未指定的具体类型。这种设计使得类能够...

    Java 泛型全解析

    Java 泛型是Java编程语言中的一项重要特性,首次引入于JDK 1.5版本。泛型的主要目的是提高代码的类型安全性和效率,同时提供更强的编译时检查。它允许开发者在类、接口和方法中定义参数化的类型,从而实现更灵活且...

    Java泛型解析(03)虚拟机执行泛型代码.doc

    Java泛型解析(03)虚拟机执行泛型代码.doc

    java泛型精华

    本文将深入探讨Java泛型的精髓,解析其工作原理,以及在使用过程中可能遇到的问题和解决方案。 #### 泛型擦除与类型安全 Java泛型的实现方式被称为“擦除”(Erasure),即在编译阶段,编译器会根据泛型参数进行...

    学士后Java集合框架和泛型课后习题答案

    10. **CollectionHomework**:这个文件可能包含了关于集合框架和泛型的习题解答,涵盖了上述各个知识点的实际应用,通过解题可以帮助巩固理论知识并提升实践能力。 通过学习和练习这些内容,你可以深入理解Java集合...

    Java泛型和集合-英文版

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

    泛型工具类

    ### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型...对于任何希望深入了解Java泛型和设计模式的开发者来说,深入研究并掌握此类工具类的实现原理和应用场景都是一项非常有价值的技能。

    Java泛型梳理.

    ### Java泛型梳理 #### 一、泛型概念解析 泛型是一种参数化的类型机制,其核心在于将具体的类型参数化处理。这种处理方式类似于函数中的变量参数——具体类型可以在定义时留空,而在实际使用时传入。这种方式极大...

    java泛型解析

    总的来说,Java泛型通过提供类型安全和代码的简洁性,极大地提升了Java编程的体验。它降低了因类型转换错误导致的bug出现概率,增强了代码的可读性和可维护性,同时也为未来的JVM优化提供了可能性。在编写涉及集合...

    基于Java的泛型编程

    以下是对这一主题的详细解析,旨在全面阐述泛型编程在Java中的应用及其重要性。 ### 泛型编程的意义 泛型编程是一种编程范式,它允许在编写代码时使用类型参数,从而实现代码的重用性和灵活性。相比于传统的面向...

Global site tag (gtag.js) - Google Analytics