泛型的理解和复习

1.泛型的理解

  • < E>,泛型参数,使用引用数据类型来赋值。

2.泛型在集合、比较器中的使用(重点)

  • 集合:ArrayList 、HashMap、Iterator
  • 比较器:Comparable、Comparator

3.自定义泛型类/泛型接口、泛型方法 (熟悉)

  • class Order< T >{}
  • public static < E > 返回值类型 方法名(形参列表){}
  • 具体的细节
1. 自定义泛型类\接口
1.1 格式
class A<T>{

}

interface B<T1,T2>{

}


1.2 使用说明
① 我们在声明完自定义泛型类以后,可以在类的内部(比如:属性、方法、构造器中)使用类的泛型。

② 我们在创建自定义泛型类的对象时,可以指明泛型参数类型。一旦指明,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型。

③ 如果在创建自定义泛型类的对象时,没有指明泛型参数类型,那么泛型将被擦除,泛型对应的类型均按照Object处理,但不等价于Object- 经验:泛型要使用一路都用。要不用,一路都不要用。

④ 泛型的指定中必须使用引用数据类型。不能使用基本数据类型,此时只能使用包装类替换。

⑤ 除创建泛型类对象外,子类继承泛型类时、实现类实现泛型接口时,也可以确定泛型结构中的泛型参数。
如果我们在给泛型类提供子类时,子类也不确定泛型的类型,则可以继续使用泛型参数。我们还可以在现有的父类的泛型参数的基础上,新增泛型参数。

1.3 注意点
① 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:<E1,E2,E3>JDK7.0 开始,泛型的简化操作:ArrayList<Fruit> flist = new ArrayList<>();

③ 如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。

④ 不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity];

参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。

⑤ 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,但不可以在静态方法中使用类的泛型。

⑥ 异常类不能是带泛型的。


2. 自定义泛型方法
2.1 问题:在泛型类的方法中,使用了类的泛型参数。那么此方法是泛型方法吗?

2.2 格式
权限修饰符号<T> 返回值类型 方法名(形参列表){  //通常在形参列表或返回值类型的位置会出现泛型参数T

}

2.3 举例
 public <E> E method(E e){

    }

2.4 说明
>声明泛型方法时,一定要添加泛型参数<T>
>泛型参数在方法调用时,指明具体的类型
>泛型方法可以根据需要声明为static>泛型方法所属的类是否是一个泛型类都可以


4.泛型在继承上的体现

  1. 类SuperA是类A的父类,则G< SuperA > 与 G< A >的关系:G< SuperA >是并列的两个类,没有任何的子父类的关系

比如: ArrayList< Object > ArrayList< String >没有关系

  1. 类SuperA是类A的父类或接口,SuperA< G > 与 A< G >的关系:SuperA< G > 与 A< G > 有继承或实现的关系 即 A< G >的实例额可以赋值给SuperA< G >类型的引用(或变量)

比如:List< String > 与 ArrayList< String > 的关系

5.通配符的使用

  • ? 的使用(重点)
    • 以集合为例:可以读取数据、不能写入数据(例外:null)
  • ? extends A
    • 以集合为例:可以读取数据、不能写入数据(例外:null)
  • ? super A
    • 以集合为例:可以读取数据、可以写入A类型或A类型的子类的数据(例外:null)
1. 通配符:  ?

2. 使用说明:
>举例:ArrayList<?>

>G<?> 可以看做是G<A>类型的父类,即可以将G<A>的对象赋值给G<?>类型的引用(或变量)

3. 读写数据的特点(以集合为例说明)
> 读取数据:允许的,读取的值的类型为Object类型
> 写入数据:不允许的,特例:写入null4. 有限制条件的通配符

   List<? extends A> :可以将List<A>List<B>赋值给List<? extends A>,其中B类是A类的子类
   List <? super A> :可以将List<A>List<B>赋值给List<? extends A>,其中B类是A类的父类

5. 有限制条件的统配符的读写操作(难、了解)
技巧:开发中,遇到了带限制条件的通配符,在赋值时,如果没有报错,那就正常使用
     如果报错了,知道不能这样写,改改!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

死磕java的孤行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值