Java-泛型

目录

泛型的理解及其在集合、比较器中的使用

什么是泛型?

在集合使用泛型之前可能存在的问题

在集合、比较器中使用泛型

 使用说明

练习:

​编辑​编辑

泛型在继承上的体现及通配符的使用

体现

通配符的使用

  读取数据时的特点( 以ArrayList为例说明):

  有限制条件的通配符的使用

  有限制条件的通配符的读写情况

   针对于List

   针对于List

   总结

自定义泛型类、泛型方法(不重要,熟悉)

自定义泛型类

        格式:

        使用说明 

        注意点

自定义泛型方法

     格式

     举例

     说明


泛型的理解及其在集合、比较器中的使用

什么是泛型?

        所谓泛型,就是允许在定义类、接口时通过一个“标识”表示类中某个“属性的类型”或者是某个方法的“返回值或参数的类型”。这个类型参数将在使用时(比如,继承或实现接口时、创建对象或调用方法时)确定(即传入实际的类型参数,也称为类型参数)

在集合使用泛型之前可能存在的问题

        1.类型不安全。就比如:集合框架中任何一个集合的add()方法的参数都是Object类型,意味着任何类型的对象都可以添加成功,这就是前面篇章中提到的数组的优点(数据类型一样)。泛型为此问题提供了解决方案

        2.需要使用强转操作,繁琐。还可能导致ClassCastException异常。就比如,在用迭代器的时候:原来应该进行一系列判断、转换类型的操作,而添加的元素都是同一类的情况下就不用考虑这情况了

在集合、比较器中使用泛型

ArrayList

1e99a5b22fee4b26a7e0a168b86695cb.jpg

HashMap

8508f054799d4c8ebb5d7ca7d5c338c5.jpg

c02d32da25ee4f38b5d4eb542e429cd0.jpg

 01ca7b210fab40b6a2aefe9e1f189788.jpg

 使用说明

        集合框架在声明接口和实现类时,使用了泛型(jdk5.0后)

        在实例化集合对象时:

                1.如果没有使用泛型,则认为操作是Object类型的数据

                2.如果使用了泛型,则需要指明泛型的具体类型。一旦指明了泛型的具体类型,凡是使用泛型的位置都要被替换为泛型的类型

练习:

642291ef3a264798a383a871fd25ebf1.jpg7377e924f30e4477ab115799527e9d77.jpg

ad8c8403ba92404aa6dc90a5b88e9df2.jpgb48aaaafe01643a5ba2eaf5cd618bdb0.jpg

861ff381700c4988bb844c6c526f5ec9.jpg


泛型在继承上的体现及通配符的使用

体现

  • 类SuperA是类A的父类或接口,SuperA<G>与A<G>的关系?两者之间有继承或实现的关系,即A<G>的实例可以赋值给SuperA<G>类型的引用(或变量)。
    • 比如List<String>、ArrayList<String>
  • 类SuperA是类A的父类或接口,则G<SuperA>与G<A>的关系?两者是并列的两个类,没有任何子父类的关系
    • 比如ArrayList<Object>、ArrayList<String>。

通配符的使用

        通配符指的就是"?";比如ArrayList<?>;G<?>可以看作是G<A>类型的父类,既可以将G<A>的对象赋值给G<?>类型的引用(或变量)

  读取数据时的特点( 以ArrayList<?>为例说明):

  • 读取数据是允许的,读取的值的类型是Object类型
  • 写入数据,是不允许的;但是有一个特例:写入数据null;

  有限制条件的通配符的使用

        super和extends的修饰:extends相当于<=;super相当于>=

  有限制条件的通配符的读写情况

   针对于List<? extends A>
  • 读取数据是允许的,读取的值的类型是A或A的子类类型
  • 不可以写入数据,(除了null)

   针对于List<? super A>

可以写入数据

   总结

        开发中遇到了带限制条件的通配符时,在赋值时,如果没报错,就正常使用;报错了,就改一改。不要浪费时间;

        带限制条件的通配符,如果是?extendsA的形式就不能写入数据(除了null),但如果是?superA的形式就可以写入;如果只是普通的通配符就不能写入数据


自定义泛型类、泛型方法(不重要,熟悉)

自定义泛型类

        格式:

//自定义泛型类
class A<T>{
 }
//自定义泛型接口
interface B<T1,T2>{ 
}

        使用说明 

  • ①我们在声明完类以后,可以在类的内部(比如属性,方法,构造器中)使用类的泛型
  • ②我们在创建自定义泛型类的对象时,可以指明参数类型,一旦指明,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型
  • ③如果在创建自定义泛型类的对象时,没有指明泛型参数类型,那么泛型将被擦除,泛型对应的类型均按照Object处理,但不等价于Object。
    • 经验:泛型要使用一路都要用,要不用,一路都不要用
  • ④泛型的指定中必须使用引用数据类型。不能使用基本数据类型,此时只能用包装类替换
  • 除创建泛型类的对象外,子类继承泛型类的时候、实现类实现泛型接口时,也可以确定泛型结构中的泛型参数。如果我们给泛型类提供子类时,子类也不确定泛型的类型,则可以继续使用泛型参数。我们可以在现有的父类的泛型参数的基础上,新增泛型参数

        注意点

  • ①泛型类如果有多个参数,此时应将多个参数一起放在尖括号内。比如<E1,E2,E3>
  • ②JDK7.0开始,泛型的简化操作,可以这样写了ArrayList<Fruit> flist = new ArrayList < > ()
  • 如果泛型结构是一个接口或抽象类,则不可以创建泛型类的对象。
  • ④不能使用new E[ ]。但是可以E [ ] elements = (E [ ])new Object[capacity];
  • ⑤在类/接口上声明的泛型,在本类或本接口中即代表某种类型,但不可以在静态方法中使用类的泛型
    • 静态方法在加载类的时候就已经确定了,而泛型确定的时候比他还要晚
  • ⑥异常类是不能带泛型的

自定义泛型方法

        提问:在泛型类的方法中使用了类的泛型参数了,那这个方法就是泛型方法了吗?不是

     格式

  • 权限修饰符 < T > 返回值类型 方法名(形参列表) { }
  • 通常在形参列表或返回值类型的位置出现泛型参数T、

     举例

  • public <E> E method( E e ){ return null;}
  • 里面的<E>起一个说明的作用

        格式中的<>只是为了起一个说明的作用,为了说明他后面的E是一个泛型参数

     说明

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奈奈朵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值