<泛型>学习笔记

泛型:编写的代码可被不同类型所重用

一.基础

使用地方:

  1. 泛型类
  2. 泛型接口
  3. 泛型方法

 

二.注解

1.

(1).泛型类声明方法:

 

class Generic<T>{
  private T field;

  public T method(T param){
  }
}
main{
  Genenic<Integer> test = new Genenic<>();
}

外部实例化类时,类中的所有T 会自动转化为对应类型。

 

(2).泛型接口

interface Generic<T>{
}

 

(3).泛型方法

public <T> T method(T param){}

第一个<T>为 引入类型

调用方法时确定引入类型后

方法中的所有 T -> 引入类型

 

2.T extends S

当需要使 泛型结构只能设置为 某特定类型 及 其子类 时,

将<T> 替换为<T extends S>

多种类型则用&连接

 

 

3.泛型通配符

由于泛型数据结构搭载 类型时 无法使结构本身获取类型自带的 继承关系...?

例子如下:

Basketball 与 soccer 均为Ball子类

但Basket<Ball> 却无法与 Basket<Basketball> 相互赋值

所以产生了界定符

/*类定义*/
public class Ball{}

class Basketball extends Ball{}

class Soccer extends Ball{}

/*泛型类,用于搭载球类*/
public class Basket<T extends Ball>{
    private T ball;
    public Basket(Ball ball){
       this.ball = ball;
    }
} main(){ Basket
<Basketball> basket1 = new Basket(new Basketball); Basket<Ball> basket2 = basket1; //此会报错 }

 

(1)上限界定符<? extends S>

Basket<? extends Ball>则使 Basket能接受的类型为 Ball自身及其子类

缺陷:此泛型类只能从中取数据,不可向其中放数据

 

(2)下限界定符<? super S>

Basket<? extends Basketball>则使Basket能接受的类型为 Basketball自身及其父类

缺陷:此泛型类只能向中放数据,不可从其中取数据

 

 

三.扩展

由于泛型是JDK5才出现的,为了保证兼容性

泛型的实现机制是,在编译时 通过类型擦除 将T转化为Object

(若T有继承,则转化为第一个继承类)

而继承泛型方法是通过 自动桥机制 进行实现。

 

注释:S指代 特定类型

 

posted @ 2021-03-05 15:03  AvenXXR  阅读(14)  评论(0)    收藏  举报