原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();