Java基础-----泛型

Java基础-----泛型


一、泛型介绍

1.1、泛型基本概念

在这里插入图片描述

1.2、泛型的好处

在这里插入图片描述

1.3、类型擦除

在这里插入图片描述


二、泛型的使用

2.1、定义泛型

在这里插入图片描述

2.2、泛型类

在这里插入图片描述

package wr.oyc;
//泛型类
public class Generic <T>{
    
    

    private T flag ;

    private T name ;

    public T getFlag() {
    
    
        return flag;
    }

    public void setFlag(T flag) {
    
    
        this.flag = flag;
    }


    public <T> T getName (T name) {
    
    
        return  name ;
    }


    public <T> void setName(T name){
    
    
        System.out.println(name);
    }


}

package wr.oyc;

public class Main {
    
    
    public static void main(String[] args) {
    
    
//泛型类的使用

//        避免类型转换的失败
        Generic<String> generic = new Generic<>();

        generic.setFlag("我的世界");

        System.out.println(generic.getFlag());


        
        Generic<Integer> genericInteger = new Generic<>();

       String name =  genericInteger.getName("12");
       
        Integer integer =  genericInteger.getName(123);

        System.out.println(name);
        System.out.println(integer);

    }
}

2.3、泛型接口

在这里插入图片描述

package wr.oyc.interface1;

public interface Igenic<T> {
    
    


    public T getName(T name) ;

}
package wr.oyc.interface1;

public class IgenicImpl implements Igenic {
    
    



    @Override
    public Object getName(Object name) {
    
    
        return name;
    }
}

package wr.oyc.interface1;

import wr.oyc.Generic;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Igenic<Integer> igenic = new IgenicImpl();

        int name = igenic.getName(123);

        System.out.println(name);

    }
}

在实现类那里不写类型,那么就Object类

在这里插入图片描述

在这里插入图片描述

2.4、泛型方法

在这里插入图片描述

2.4.1、非静态方法

在这里插入图片描述

2.4.2、静态方法

静态方法中使用泛型时有一种情况需要注意,

静态方法无法访问类上定义的泛型;

如果静态方法操作的引用类型不确定的时候,必须药将泛型定义在方法上

package wr.oyc.staticmethod;

public class Main01 {
    
    


    public static <T> T getName(T name){
    
    

        return name;
    }



    public static <T> void setName(){
    
    

        System.out.println("使用了setName()");
    }
}

package wr.oyc.staticmethod;

public class TestMain01 {
    
    
    public static void main(String[] args) {
    
    
      String str =   Main01.getName("a");

      double d = Main01.getName(1.0);

        System.out.println(d);
        System.out.println(str);
    }

}

在这里插入图片描述

2.4.3、泛型方法与可变参数

在泛型方法中,泛型也可以定义可变参数

在这里插入图片描述

package wr.oyc.variableparam;


public class Main01 {
    
    

    //遍历任意类型的数组
    public static  <T> void forArr (T...t){
    
    

        for (T a :t) {
    
    
            System.out.println(a);
        }
    }
}
package wr.oyc.variableparam;

public class MainTest {
    
    
    public static void main(String[] args) {
    
    
//        String [] strs = new String[]{"1","3"};
//        Main01.forArr(strs);
//
//        Integer [] i =  new Integer[]{1,2,3,5,4,12};
//        Main01.forArr(i);


        Object [] a = new Object[]{
    
      "a" , true , 'a'};
        Main01.forArr(a);
    }
}

在这里插入图片描述

2.5、通配符和上下限定

2.5.1、无界通配符

在这里插入图片描述
在这里插入图片描述

Genic类
在这里插入图片描述
一个showMessage类(里面有一个方showFlag需要闯入Generic对象) 首先我把泛型写死
在这里插入图片描述
那么在测试方法中,会发现爆红
在这里插入图片描述
原因如下:

在这里插入图片描述

解决方案:
在showMessage类中方法showFlag方法中Generic类的泛型写为<?>
在这里插入图片描述

2.5.2、上界通配符

上限限定表示通配符的类型是T类以及T类的子类或者T接口以及T接口的子接口

该方法同样使用于泛型的上限限定

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

只要是Integer的子类以及Integer即可

2.5.3、下界通配符

下限限定表示通配符的类型是T类以及T类的父类或者T接口以及T接口的父接口

注意:该方法不适用泛型类

在这里插入图片描述

只要是Integer的父类都行


三、 泛型总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_48788523/article/details/121749790