0


【Java】这个泛型不太正经

一、前言

泛型在java中有很重要的地位,在实际开发中用处也很大。

二、泛型

泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数

将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数

泛型的类型:

①:泛型类

**②:泛型方法 **

③:泛型接口

三、泛型定义的格式:

<类型> :指定一种类型的格式,这里的类型可以看成是形参。

<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型类型1,类型2可以看成是形参,将来具体调用的时候的参数看成是实参,这里的泛型只能是引用类型

什么是引用类型?

除了八大基本类型其他的都是引用类型,如基本类型对应的包装类

  • boolean -->Boolean
  • char --->Character
  • byte -->Byte
  • short -->Short
  • int -->Integer
  • long -->Long
  • float -->Float
  • double -->Double

泛型的好处是:

  • 把运行得问题提前到编译时期
  • 避免了强制转换

没指定类型默认是Object类型

举个例子,当没有使用泛型时:

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Set;
  4. public class 泛型Demo {
  5. public static void main(String[] args) {
  6. //创建一个对象
  7. Map map=new HashMap();
  8. //添加数据
  9. map.put(1, "张三");
  10. map.put(2, "李四");
  11. map.put(3,"王五");
  12. map.put(5, 6);//加了不一样的类型数据
  13. //键的集合
  14. Set keySet=map.keySet();
  15. //键找值
  16. for(Object key: keySet){
  17. String value=(String)map.get(key);
  18. System.out.println(key+":"+value);
  19. }
  20. }
  21. }

报了一个类型转换异常(int会自动转化成Integer),Integer不能转为String

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

此时泛型的好处就体现出来了,将运行时会出现的错误拉到了编译期间。

当然也可以在输出是采用Object接收

  1. //键的集合
  2. Set keySet=map.keySet();
  3. //键找值
  4. for(Object key: keySet){
  5. Object value=map.get(key);
  6. // String value=(String)map.get(key);
  7. System.out.println(key+":"+value);
  8. }

这样也可以得到想要的结果。

四、泛型类

泛型类的定义格式:

修饰符 class 类名<类型> { }

举例:

  1. public class Generic<T>{}

这里的T可以使任意标识,常见的如T、E、K、V等形式常用于表示泛型。

泛型类下

  1. public class Generic<T> {
  2. //定义一个变量,提供get set方法
  3. private T t;
  4. public T getT(){
  5. return t;
  6. }
  7. public void SetT(T t){
  8. this.t=t;
  9. }
  10. }

测试类下

  1. public class GenericDemo {
  2. public static void main(String[] args) {
  3. Generic<String> g1=new Generic<>();
  4. g1.SetT("章三");
  5. System.out.println(g1.getT());
  6. System.out.println("------------------");
  7. Generic<Integer> g2=new Generic<>();
  8. g2.SetT(100);
  9. System.out.println(g2.getT());
  10. }
  11. }

运行结果

定义这个泛型类的好处就是可以在测试中输入各种你想要的类型。

五、泛型方法

定义泛型方法的格式:

修饰符 <类型> 返回值类型 方法名 (类型 类型名)

举例:

  1. public <T> void show (T t){}

泛型方法

  1. public class Generic {
  2. public <T> void show(T t){
  3. System.out.println(t);
  4. }
  5. }

泛型方法测试下:

  1. public class GenericDemo {
  2. public static void main(String[] args) {
  3. Generic g=new Generic();
  4. g.show("张三");
  5. g.show(100);
  6. g.show(true);
  7. g.show(null);
  8. }
  9. }

运行结果

泛型方法比泛型类方便许多,直接在这使用即可,可以用个中类型的参数

六、泛型接口

格式:修饰符 interface 接口名<类型>{}

举例:

  1. public interface Generic<T>{}

既然是接口那就得定义一个类 去实现这个接口

泛型接口:

  1. public interface Generic<T>{
  2. void show();
  3. }

GenricImp类下:

  1. public class GenricImp<T> Generic<T>{
  2. public void show(T t){
  3. System.out.println(t);
  4. }
  5. }

GenricDemo类下:

  1. public class GenricDemo{
  2. public static void main(String[]args){
  3. Generic<String> g1=new GenericImp<String>();
  4. g1.show("张三");
  5. Generic<Integer> g2=new GenericImp<Integer>();
  6. g2.show(100);
  7. }
  8. }

七、类型通配符

<? extends T>上限通配,?表示是T的一个未知子类。 <? super T>下限通配,?表示是T的一个未知父类。

本文转载自: https://blog.csdn.net/weixin_60719453/article/details/122261645
版权归原作者 执久呀 所有, 如有侵权,请联系我们删除。

“【Java】这个泛型不太正经”的评论:

还没有评论