泛型

来源:互联网 发布:阿里云虚拟主机 使用 编辑:程序博客网 时间:2024/05/16 12:58

泛型
课程大纲
一、 没有泛型的日子
1、话说小白接到前女友凤凤的来电说有个孩子是小白的,小白顿时被石化了。。。。。
二、 泛型
1、 JDK1.5之后出现了新技术——泛型,(Genergic),此技术的最大特点是类中的属性的类型可以由外部决定,而且在声明类的时候应该采用如下形式:
2、 class 类名称<泛型类型,泛型类型,…>{}
3、 在使用泛型操作的时候,实际上有很多小的注意点,例如:构造方法上依然可以使用泛型,或者有一种称为泛型的擦除。
4、 相关术语:
ArrayList:E称为类型变量或者类型参数
ArrayList:称为参数化的类型
ArrayList:中的Integer称为参数的实例或实际参数类型
ArrayList:<>称为type of
ArrayList:称为原始类型
5、 参数化类型与原始类型的兼容性
Collection c = new Vecor();
Collection c = new Vector();
6、 参数化类型不考虑类型参数的继承关系
Vector c = new Vector();//错
Vector c = new Vector();//错
正确:
Vecotor v = new vector();
Vector v2 = v;
错误:
定义数组不能使用泛型
Vector[] vs = new Vector()[10];
7、 两个问题:
(1)、在构造方法上引用泛型
(2)、如果在使用时没有指定泛型的话,则表示擦除,泛型一旦擦除之后,将按照Object进行接收,以保证程序不出现任何的错误。
三、 通配符
1、 问题:
Children c1= new Children();
Children c2 = new Children();
C1=c2;此时无法转换
2、“?”表示的是可以接受任意的泛型类型,但是只是接受输出,并不能修改。
3、提示:使用通配符可以引用其他各种参数化类型,通配符定义的变量主要用作引用,可以调用与参数无关的方法,不能调用与参数有关的方法。
4、泛型上线就是指一个操作泛型最大的操作父类,例如:现在最大的上限设置成Number类型,那么此时所能够接收到的类型只能是number及其子类,泛型的上限用过以下语法完成:?extends 类
5、泛型的下限指的是只能设置其具体的类,或者父类,这只语法如下:?super 类
四、 泛型接口
1、泛型不光可以在类上使用,还可以在接口中定义,操作语法如下:interface <泛型类型,泛型类型。。。>{}
五、 泛型方法
1、 泛型处了在类中定义之外,还可以子啊方法上定义,而且在方法上使用泛型,此房产所在的类不一定是泛型的操作类。
2、 定义一个方法:实现任意类型数组中两个位置值得调换:
Public static T[] func(T[]array,int I,int t)
{
T temp = array[i];
array[i] = array[t];
array[t] =temp;
return array;
}
六、 泛型的嵌套使用
1、 集合Map时用过,
2、 Set

代码

一、使用泛型定义

package us.google.www;
/**
* 使用泛型定义
* T:表示泛型,表示所有的类型
* @author chongrubujing
*
*/
public class Children {
private String name;
private T age;
public Children() {
super();
}
public Children(String name, T age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
@Override
public String toString() {
return “Children [name=” + name + “, age=” + age + “]”;
}

}

二、定义泛型上限

package us.google.www;
/**
* 使用泛型定义:定义泛型上限
* T:表示类型,表示所有类型
* @author chongrubujing
*
*/
public class Children2 {
private String name;
private T age;
public Children2() {
super();
}
public Children2(String name, T age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
@Override
public String toString() {
return “Children2 [name=” + name + “, age=” + age + “]”;
}

}

三、使用泛型定义接口

package us.google.www;
/**
* 使用泛型定义接口
* @author chongrubujing
*
*/
public interface IEat {
public void eat(T food);
}
class IEatimpl implements IEat
{

@Overridepublic void eat(T food) {}

}

泛型例子:

package us.google.www;
/**
* 泛型
* @author chongrubujing
*
*/
public class GenericDmeo {

public static void main(String[] args) {    Children<Integer> c1  = new Children<Integer>("小小白",3);    Children<Float> c2  = new Children<Float>("小小黑",1.6f);    Children<String> c3  = new Children<String>("小小黄","二");    Children<String> c4 = new Children("小小花","三");    Children c5 = new Children<String>("小小花","三");    //定义数组不能使用泛型    //Children<String>[] cs = new Children<String>{};    int age1 = c1.getAge();    System.out.println(c1.getName()+"的年龄是:"+age1);    float age2 = c2.getAge();    System.out.println(c2.getName()+"的年龄是:"+age2);    String age3 = c3.getAge();    System.out.println(c3.getName()+"的年龄是"+age3);    Children<Integer> c7 = new Children<Integer>();    Children<String> c8 = new Children<String>();    //错误,参数化类型不同,两个对象不能互相赋值    //c8=c7    print(c1);    print(c2);    //使用泛型上限    Children2<Integer> c9  = new Children2<Integer>();    //使用泛型下限    fun(c3);    //使用泛型方法    String[] names = {"小白","凤凤","空空"};    names = fun2(names, 0, 2);    for (String s : names) {        System.out.println(s);    }}/** * 使用通配符定义参数 */public static void print(Children<?> c){    //c.setAge(10);//使用通配符只能输出,不能修改,可以传进去任何类型的参数    System.out.println("我的年龄是:"+c.getAge());}//定义泛型下限public static void fun(Children<? super String> c){    System.out.println(c.getAge());}/** * 定义泛型方法,任意类型的数组 * @param array * @param i * @param t * @return */public static <T> T[] fun2(T[] array,int i,int t){    T temp = array[i];    array[i] = array[t];    array[t] = temp;    return array;}

}

0 0