泛型(Generic)

一、为何要引入泛型

Demo:当集合中存储的对象类型不同时,那么会导致程序在运行时候出现异常怎么解决呢?(引入泛型)

package cn.lyjs.genecity;

import java.util.ArrayList;

public class Demo1 {
    public static void main(String args[]){
        ArrayList list=new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add(123);//添加了非字符类型的数据
        
        //把集合中的所有元素转换成大写
        for(int i=0;i<list.size();i++){
            String str=(String) list.get(i);
            System.out.println(str.toUpperCase());
        }
    }
}

二、引入泛型的好处

  • 把运行时出现的问题提前至编译时
  • 避免了无谓的强制类型转换

泛型在集合中的应用:

ArrayList<String> list=new ArrayList<String>();  true
ArrayList<Object> list =new ArrayList<String>(); false
ArrayList<String> list=new ArrayList<Object>();  false

考虑到了新老系统的兼用性:才允许使用

ArrayList list=new ArrayList<String>();           true
ArrayList<String> list=new ArrayList();           true

注意点:

在泛形中没有多态的概念,两边的数据必须要一致。或者是只写一边的泛形类型。推荐使用: 两边的数据类型都写上一致的。

三、泛型方法

 

自定义泛型:自定义泛型可以理解为是一个数据类型的占位符,或者理解为是一个数据类型的变量

 

泛型方法格式的定义:

    修饰符   <声明自定义类型> 返回值类型  函数名(形参列表...){
     
    }

注意:

  1. 在方法上的自定义泛型的具体数据类型是调用该方法的时候传入实参的时候时确定的。
  2. 自定义泛型使用的标识符只要符合标识符的命名规则即可
public class Demo2 {
    public static void main(String[] args) {
        
        Integer i=print(12);
        String str=print("abc");
    }
    
    public static <T> T print(T o){
        return o;
    }
}

四、泛型类

泛型类的定义格式:

class 类名<声明自定义的泛型>{
 
}

注意的事项:

  1. 在类上自定义的泛型的具体数据类型是在创建对象的时候指定的
  2. 在类上自定义了泛型,如果创建该类的对象时没有指定泛型的具体类型,默认是Object类型
class MyList<T>{
    Object []arr=new Object[10];
    int index=0;
    public MyList(){
        
    }
    
    public void add(T o){
        arr[index++]=o;
    }
    
}

错误代码分析:使用泛型创建新的对象是不能创建对象的,创建对象必须指明确定的类型。

五、泛型接口

泛型接口的定义格式:

interface 接口名<声明自定义的类型>{
}

在接口上自定义类型需要注意的事项:

  1. 在接口上自定义泛型的具体数据类型是在实现该接口的时候指定的
  2. 如果一个接口自定义了泛型,在实现该接口的时候没有指定具体的数据类型,那么默认的就是Object
interface Dao<T>{
    public void add(T t);
    public void remove(T t);
}
public class Demo4 implements Dao<String> {

    @Override
    public void add(String t) {
        // TODO Auto-generated method stub  
    }
    @Override
    public void remove(String t) {
        // TODO Auto-generated method stub
        
    }

}

如果想在创建接口实现类对象的时候再指定接口自定义类型泛型的具体数据类型?

在定义类的时候也使用泛型

 

interface Dao<T>{
    public void add(T t);
    public void remove(T t);
}
public class Demo4<T> implements Dao<T> {

    public static void main(String[] args) {
        new Demo4<String>();
    }
    @Override
    public void add(T t) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void remove(T t) {
        // TODO Auto-generated method stub
        
    }

}

 

posted @ 2015-11-24 16:42  好人难寻  阅读(438)  评论(0)    收藏  举报