`

Java中Generics泛型

    博客分类:
  • Java
阅读更多
1. Java中Generics泛型

Generics泛型是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

import java.util.ArrayList;
import java.util.List;
public class ArrayListTest{
    public static void main(String[] args){
        List list = new ArrayList();
        list.add("string");
        list.add(new Integer(2));
        list.add(new Boolean(false));
        String str = (String)list.get(0);
        Integer in = (Integer)list.get(1);
        String b = (String)list.get(2);
    }
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
    at org07.ArrayListTest.main(ArrayListTest.java:18)


2. 自定义泛型

自定义泛型,可以定义多个泛型Generic<T1, T2>,用set和get方法实现。
public class Generic<T1, T2>{
    private T1 foo1;
    private T2 foo2;
    public T1 getFoo1(){
        return foo1;
    }
    public void setFoo1(T1 foo1){
        this.foo1 = foo1;
    }
    public T2 getFoo2(){
        return foo2;
    }
    public void setFoo2(T2 foo2){
        this.foo2 = foo2;
    }
    public static void main(String[] args){
        Generic<Integer, Boolean> foo = new Generic<Integer, Boolean>();
        foo.setFoo1(new Integer(-20));
        foo.setFoo2(new Boolean(false));
        System.out.println(foo.getFoo1());
        System.out.println(foo.getFoo2());
    }
}
运行结果:
-20
false

泛型数组的存取
public class Generic2<T>{
    private T[] fooArray;
    public T[] getFooArray(){
        return fooArray;
    }
    public void setFooArray(T[] fooArray){
        this.fooArray = fooArray;
    }
    public static void main(String[] args){
        Generic2<String> foo = new Generic2<String>();
        String[] str1 = {"hello", "world", "welcome"};
        String[] str2 = null;
        foo.setFooArray(str1);
        str2 = foo.getFooArray();
        for(int i = 0; i < str2.length; i++){
            System.out.println(str2[i]);
        }
    }
}
运行结果:
hello
world
welcome


3. 泛型的泛型

public class WrapperFoo<T>{
    private GenericFoo3<T> foo;
    public GenericFoo3<T> getFoo(){
        return foo;
    }
    public void setFoo(GenericFoo3<T> foo){
        this.foo = foo;
    }
    public static void main(String[] args){
        GenericFoo3<Integer> foo = new GenericFoo3<Integer>();
        foo.setFoo(new Integer(-10));
        WrapperFoo<Integer> wrapper = new WrapperFoo<Integer>();
        wrapper.setFoo(foo);
        GenericFoo3<Integer> g = wrapper.getFoo();
        System.out.println(g.getFoo());
    }
}
class GenericFoo3<T>{
    private T foo;
    public T getFoo(){
        return foo;
    }
    public void setFoo(T foo){
        this.foo = foo;
    }
}
运行结果:
-10


4. 泛型上下边界

限制泛型的类型用extends关键字。ListGenericFoo<T extends List>
当我们没有指定泛型的类型或接口时,默认使用T extends Object,任何类型都可以作为参数传入。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
public class ListGenericFoo<T extends List>{
    private T[] fooArray;
    public T[] getFooArray(){
        return fooArray;
    }
    public void setFooArray(T[] fooArray){
        this.fooArray = fooArray;
    }
    public static void main(String[] args){
        ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
        ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
        LinkedList[] linkedList = new LinkedList[10];
        foo1.setFooArray(linkedList);
        ArrayList[] arrayList = new ArrayList[10];
        foo2.setFooArray(arrayList);
        // ListGenericFoo<HashMap> foo3 = new ListGenericFoo<HashMap>();
    }
}

GenericTest<? extends List> 在声明引用的时候才对泛型进行限定。
GenericTest<? super List> 在声明引用的时候才对泛型进行限定。(在List之上的泛型)
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericTest<T>{
    private T foo;
    public T getFoo(){
        return foo;
    }
    public void setFoo(T foo){
        this.foo = foo;
    }
    public static void main(String[] args){
        GenericTest<? extends List> ge = null;
        ge = new GenericTest<ArrayList>();
        ge = new GenericTest<LinkedList>();
        // ge = new GenericTest<HashMap>();
        GenericTest<? super List> ge2 = null;
        ge2 = new GenericTest<Object>();
        GenericTest<String> ge3 = new GenericTest<String>();
        ge3.setFoo("hello world");
        GenericTest<?> ge4 = ge3;
        System.out.println(ge4.getFoo());
        ge4.setFoo(null);
        System.out.println(ge4.getFoo());
        // ge4.setFoo("welcome");
    }
}
运行结果:
hello world
null

ge4.setFoo("welcome");是错误的。因为需要强制类型转换。不符合泛型定义。
使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
分享到:
评论

相关推荐

    Java Generics and Collections (Java泛型与集合)

    通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们的高级特性和最佳实践,从而在实际项目中编写出更高质量的代码。这本书对于Java程序员来说是一份宝贵的...

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    6. **协变和逆变**:理解如何在泛型中实现类型参数的协变和逆变。 7. **比较和equals**:在泛型上下文中正确地实现Comparable和equals()方法。 8. **枚举类型与泛型**:结合使用枚举和泛型来增强类型安全。 通过...

    Java1.5泛型指南中文版

    Java 1.5引入了泛型(Generics)的概念,这是一个重要的语言特性,它允许开发者在编译时期指定集合或其他数据结构中的元素类型,从而避免了运行时期的类型转换错误。通过使用泛型,开发者可以在编程阶段就确保类型的...

    深入Java:Generics泛型

    泛型是Java编程语言中的一个重要特性,它允许程序员在定义类、接口以及方法时使用类型参数,从而提高代码的重用性和安全性。泛型的主要目标是实现类型安全,避免在运行时进行强制类型转换,同时提供编译时的类型检查...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    java中的泛型样例

    这个压缩包文件"Generics"可能包含了多个示例,用于演示和解释泛型在Java中的应用。 泛型引入于Java 5,它的主要目标是提供编译时的类型检查,避免了类型转换的麻烦,并且能够减少运行时错误。下面我们将详细讨论...

    java中的泛型-详细

    - `extends`关键字在泛型中的作用不是表示继承,而是用来限定类型参数的范围。例如,`List&lt;? extends Number&gt;`表示列表中的元素是Number或者其子类。 4. **泛型与数据类型转换** 泛型的主要优点之一是自动类型...

    给公司内部培训的PPT,JAVA技术,泛型

    泛型是Java编程语言中的一个重要特性,首次引入于JDK 1.5版本。它允许在定义类、接口和方法时使用类型参数,从而增强了代码的类型安全性和可读性。泛型的主要目的是减少类型转换的繁琐过程,并在编译阶段捕获潜在的...

    Java编程语言中的泛型

    随着JDK 1.5的发布,Java编程语言引入了一系列重要扩展,其中最显著的特点之一便是泛型(Generics)。本文将详细介绍Java中的泛型概念及其应用。无论您是否熟悉其他编程语言中的类似结构,如C++的模板,都将通过本文...

    java集合与泛型.pdf

    泛型(Generics)是Java SE 5.0版本引入的特性,它允许在编译期间进行类型检查和类型转换,提高代码的复用性和类型安全。 Java集合框架包含了一系列接口,最顶端的是Collection接口。Collection接口定义了一系列...

    面试必须资料java泛型攻略、

    Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...

    泛型java的泛型知识,非常有用

    - `extends` 关键字在泛型中的作用是限定类型参数的范围,如 `List&lt;T extends Number&gt;` 表示 `T` 必须是 `Number` 或其子类。 4. **泛型与数据类型转换** - 泛型的主要优点之一是消除显式类型转换的需求。在泛型...

    [Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&Philip.Wadler.文字版

    Java中的泛型是一种类型安全机制,允许在编译时检查类型错误,同时避免了运行时类型转换的开销。通过泛型,可以创建参数化类型,即类型参数(如`&lt;T&gt;`),这使得同一段代码能够处理不同类型的对象,提高了代码的重用...

    Java中泛型总结(推荐)

    Java 中泛型总结是指在 Java 语言中使用泛型(generics)来实现编译时类型安全检测机制,避免向下转型的隐患。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。在 Java 中,泛型可以用于定义类...

Global site tag (gtag.js) - Google Analytics