<java泛型>java泛型Generics

▼魔方 西西 提交于 2020-11-08 15:12:38

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文件运用泛型技术时,编译器在文件编译通过后自动擦除泛型标识。

泛型的补偿

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

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!