<java泛型>java泛型Generics

what

泛型:一般类型,也就是说可以为任何类型.

泛型的本质是“参数化类型”,也就是说: 所操作的数据类型 被指定为一个参数, 传输。泛型是在JDK1.5中引入的特性。

why

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,而不是在运行时才出现错误。

使用泛型有以下好处:

  • 编译时强类型检查

  • 无需手动进行类型转换 

  • 可以实现复用,编写通用算法

how

泛型类

ArrayList<E>

public class Tool<E> {
    private E e;
    public Tool(E e1){
        this.e = e1;
    }
    public E getE() {
        return e;
    }
    public void setE(E e) {
        this.e = e;
    } 
}

泛型方法

1)使用泛型类定义参数类型(常用)

 如泛型类Tool<AA>,它的泛型参数即为AA。那么泛型方法可以这样写:

public class Tool<AA>{
  public void show(AA aa){
  }
}

2)自定义的参数类型

public <AA> void show(AA aa){
}

注:静态方法不能访问类的泛型,如果需要泛型,我们只能使用方法2(自定义的参数类型)

泛型接口

假设有泛型接口interf<AA>,它的实现类是Tool。

1)确定实现的泛型接口的参数类型:

  假设Tool类需要String类型的参数,那么实现可以直接写:

class Tool implements interf<String>{
}

2)不确定实现的泛型接口的参数类型:

我们需要泛型类来实现

class Tool<BB> implements interf<BB>{
}

当泛型类和泛型方法一起出现的时候

泛型T  被实现类所指定的泛型类型替换,而参数e是由调用者决定的

public interface Test<T> {
    <E> T aaa(E e, T t);
}

public class Demo implements Test<Integer> {
    @Override
    public <E> Integer aaa(E e, Integer t) {
        return null;
    }   
}

当然返回类型也可更改为E

public interface Test<T> {
    <E> E aaa(E e, T t);
}
public class Demo implements Test<Integer> {
    @Override
    public <E> E aaa(E e, Integer t) {
        return null;
    }   
}

泛型通配符:?

当我们不确定传入的对象类型时我们就可以使用?来代替。“?”即泛型通配符。

泛型的限定

书写格式:

       上限:<? extends E> 表示参数类型是  E或其所有子类。

       下限:<? super E>  表示参数类型是 E或其所有超类(即父类)。

 

约定俗成的定义


? 表示不确定的java类型。 
T 表示java类型。 
K, V 分别代表java键值中的Key Value。 
E 代表Element。

 

 

泛型的擦除

一句话总结就是:在.java文件运用泛型技术时,编译器在文件编译通过后自动擦除泛型标识。

泛型的补偿

编译器在擦除泛型后,会自动将类型转换为原定义的"泛型",这样就不必再做向下类型转换了。 泛型的擦除和补偿 这两个机制都是编译器内部自动完成的,了解其原理即可。

 

 

 

转载于:https://my.oschina.net/u/3970972/blog/3030494

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值