Java基础-泛型

一、泛型概念

泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。
简单说:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

二、参数化类型

  • 把类型当作是参数一样传递
  • <数据类型>只能是引用类型

三、泛型的好处

  • 代码更加简洁【不用强制转换】
  • 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
  • 可读性和稳定性【在编写集合的时候,就限定了类型】

四、泛型的檫除

JDK5提出了泛型这个概念,为了兼容JDK5之前版本。会把带有泛型特性的集合赋值给老版本的集合时候,会把泛型给擦除

  1. 泛型只在编译阶段有效,编译之后JVM会采取去泛型化的措施。
  2. 泛型的运行阶段是没有效果 (反射机制验证,运行阶段无效)

五、泛型的表示

泛型可以定义在接口方法中,分别表示为泛型类、泛型接口、泛型方法。泛型的使用需要先声明,声明通过<符号>的方式,符号可以任意,编译器通过识别尖括号和尖括号内的字母来解析泛型。泛型的类型只能为类,不能为基本数据类型。尖括号的位置也是固定的,只能在类名之后或方法返回值之前。

一般泛型有约定的符号:E 代表 Element, 通常在集合中使用;T 代表 Type,通常用于表示类;K 代表 Key,V 代表 Value,<K, V> 通常用于键值对的表示;? 代表泛型通配符。

  • 普通符号 < T>
  • 无边界通配符 <?>
  • 上边界通配符 <? extends E>
  • 下边界通配符 <? super E>

5.1、Class,Class<?>区别?

Class在实例化的时候,T要替换成具体类
Class<?>它是个通配泛型,?可以代表任何类型

5.2、?和T区别是?

?和T都表示不确定的类,T 可以在函数里面操作 T car = getCar(),而?不能。
Object和T不同点在于,Object是一个实体类

六、泛型应用

规则

  • 必须"先声明再使用,泛型的声明是通过"<>"实现。

6.1、泛型类

public class PersonNew <T> {

    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public PersonNew(T t) {
        this.t = t;
    }
}

6.2、泛型方法

public class Demo07 <K,V> {

    /**
     * 普通方法 可以使用 类中定义的泛型
     * @param k
     * @param v
     * @return
     */
    public K method1(K k,V v){
        return (K)null;
    }

    /**
     * 普通方法  使用方法中定义的泛型
     * @param t
     * @param v
     * @param <T>
     * @return
     */
    public <T> T method2(T t,V v){
        return (T)null;
    }

    /**
     * 在静态方法中我们没法使用 类中定义的泛型
     * @return
     */
    public static <K> K method3(){
        return null;
    }

静态方法中没法使用类中定义的泛型

6.3、泛型接口

public interface CalGeneric <T extends Number>> {

    T add(T a,T b);

    T sub(T a,T b);

    T mul(T a,T b);

    T div(T a,T b);
}
public class CalIntegerGeneric implements  CalGeneric<Integer> {
    @Override
    public Integer add(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer sub(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer mul(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer div(Integer a, Integer b) {
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值