JAVA中的泛型

2015-05-17

Java

原CSDN博客已弃用,文章会逐渐迁移过来。

转帖请注明本文出自weimeig的博客(http://blog.csdn.net/weimeig/article/details/79535182),请尊重他人的辛勤劳动成果,谢谢

应朋友们反馈的JAVA基础薄弱的问题,决定出一套完整的JAVA基础教程,帮助大家复习,巩固JAVA基础,今天要讲的是JAVA中的泛型。

本篇文章基于http://blog.csdn.net/weimeig/article/details/79533661知识的基础上,请先学前面这篇文章。

泛型

集合中的元素,可以是任意类型的对象(对象的引用)

如果把某个对象放入集合,则会忽略他的类型,而把他当作Object处理

泛型则是规定了某个集合只可以存放特定类型的对象

会在编译期间进行类型检查

可以直接按指定类型获取集合元素

/** 
 * 学生类 
 * @author Administrator 
 * 
 */  
public class Student {  
    private String id;  
    private String name;  
    private Set course;  
    private Student(String id,String name){  
        this.id = id;  
        this.name = name;  
        this.course = new HashSet();      
    }  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public Set getCourse() {  
        return course;  
    }  
    public void setCourse(Set course) {  
        this.course = course;  
    }  
}  

/** 
 * 课程类 
 * @author Administrator 
 * 
 */  
public class Course {  
    private String id;  
    private String name;  
    Course(){  

    }  
    Course(String id,String name){  
        this.id=id;  
        this.name=name;  
    }  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

import java.util.ArrayList;  
import java.util.List;  


public class TestGeneric {  
    /** 
     * 带有泛型——Course,的List类型属性 
     */  
    public List<Course> courses; //<>内限制了数据的类型  
    //创建构造器实例化  
    public TestGeneric(){ //构造方法  
        this.courses = new ArrayList<Course>();  
    }  

    /** 
     * 测试添加 
     */  
    public void testAdd(){  
        Course cr1 = new Course("1","大学英语");  
        courses.add(cr1);  
        //泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错  
//      courses.add("能否添加一些奇怪的东西呢?");  
        Course cr2 = new Course("2", "Java基础");  
        courses.add(cr2);  
    }  
    public void testForEach(){  
        for(Course cr:courses){//因为规定了是Course的类型,所以直接作为Course类型取出来,不再需要作为Object类型的转换。  
            System.out.println(cr.getId() + ":" +cr.getName());  
        }  
    }  
    public static void main(String[] args){  
        TestGeneric tg =new TestGeneric();  
        tg.testAdd();  
        tg.testForEach();  
    }  
}  

泛型集合可以添加泛型的子类型的对象实例

创建ChildCourse类,继承Course类

public class ChildCourse extends Course {//ChildCourse继承了Course类型,如果Course类里已经添加了含参的构造器,  
//编译器将不会自动为他再添加一个隐式构造器,而子类又必须要调用父类的隐式构造器,因此会报错,所以需要在父类中手动定义一个的无参的隐式构造器  
//  不添加属性让他默认继承父类的属性  
}  

在TestGeneric类中添加方法

    /** 
 * 泛型集合可以添加泛型的子类型的对象实例 
 * @param args 
 */  
public void testChild(){  
    ChildCourse ccr = new ChildCourse();  
    ccr.setId("3");  
    ccr.setName("我是子类型的课程对象实例~~");  
    courses.add(ccr);  
}  

main函数中调用

TestGeneric tg =new TestGeneric();  
tg.testChild();  
tg.testForEach();  

1、泛型集合中的限定类型,不能使用基本数据类型。
2、可以通过使用包装类限定允许存入的基本数据类型

/** 
 * 泛型不能使用基本类型 
 * @param args 
 */  
public void testBasicType(){  
/       List<int> list = new ArrayList<int>();//使用基本类型报错  
    List<Integer> list = new ArrayList<Integer>();//使用包装类  
    list.add(1);//将1转化为了基本类型的包装类Integer  
    System.out.println("基本类型必须使用包装类作为泛型!" + list.get(0));  
}  

main函数中调用

TestGeneric tg =new TestGeneric();  
tg.testBasicType();