泛型

泛型
课程大纲
一、 没有泛型的日子
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
{

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值