java高级之泛型

  什么是泛型?

    在定义类时,不给定类中成员【属性 方法的返回类型 方法的参数】的数据类型,而在类对象创建时为其指定相应的数据类型。

  泛型的作用:

    为避免数据类型转换安全

  泛型的运用:

    1.定义一个泛型类并在其类名加上<T>表示泛型指代,如要指代多个泛型中间使用逗号隔开

    2.定义数据类型中使用泛型指定

    3.并且生成get、set方法、空参有参构造、toString等

public class FanXinDemo<T,E> {
    public T X;
    public T Y;
    public E Z;
}

新建一个测试类,类中声明main方法

public class FanXInTest1 {
    public static void main(String[] args) {
        //new一个对象,并按照类中定义的泛型依次对应
        FanXinDemo<String, Integer> demo1 = new FanXinDemo<>("东经99度","北纬66度",00);
    }
}
【注:使用泛型不会出现数据类型转换问题】
 

  泛型的通配符:

单独新建一个泛型类

类中声明一个泛型变量,并且生成get、set方法、空参有参构造、toString等

且声明一个方法,且在这个方法中输出你刚刚声明的泛型变量:如:

public class FanAllDemo<T> {
    public T BMW;


    public void jk(){
        System.out.println("我所返回的值是:"+BMW);
    }
    
}
再次新建测试类,类中定义main方法
【注:在main方法之外单独声明一个静态方法,以便演示泛型通配形式】:
public static void main(String[] args) {
  
    //泛型的通配符
    FanAllDemo<String> FADemo = new FanAllDemo<>("今天饿肚子了");//通用泛型一 string类型
    BMWE(FADemo);

    FanAllDemo<int> FADemo2 = new FanAllDemo<>(9999);//通用泛型一 Integer类型
    BMWE(FADemo2);

    FanAllDemo<Object> FADemo3 = new FanAllDemo<>("是他是他小哪吒");//通用泛型一 Object类型
    BMWE(FADemo3);
}

//泛型通配符的静态方法
public static void BMWE(FanAllDemo<?> xw){
    xw.jk();
}
以上代码显示了泛型的通配,这里仅仅演示了string,int,object等类型,仅此就可以观察出加上泛型通配符后及会包容所有
【注:泛型通配符 --> 变量<?> 变量】
 

  受限泛型的使用:

受限泛型语法:

[设置上限]
声明对象: 类名称<? extends 类> 对象名称;
定义类:  [访问权限] 类名称<泛型标识 extends 类>{}

[设置下限]
声明对象: 类名称<? super 类> 对象名称;
定义类:  [访问权限] 类名称<泛型标识 super 类>{}

eg:
这里还是沿用泛型通配符建的泛型类
新建一个测试类,中声明main方法
且在main方法之外声明两个静态方法,一个上限静态方法,一个下限方法
public static void main(String[] args) {

}
//受限泛型的使用--上限(extends)
public static void BMWELimitUp(FanAllDemo<? extends Number> xw){
    xw.jk();
}

//受限泛型的使用--下限(super)
public static void BMWELimitBottom(FanAllDemo<? super Number> xw){
    xw.jk();
}
 
在main方法中new 一个泛型类,且调用上限、下限静态方法
及:
 
 
public static void main(String[] args) {
  //泛型的受限使用--上限
        //[只要是Number的子类都可以接受(包括本身)]
        FanAllDemo<Integer> BMWELimitUpDemo = new FanAllDemo<>(2580);//上限的子类
        BMWELimitUp(BMWELimitUpDemo);
        FanAllDemo<Double> fanAllDemo = new FanAllDemo<Double>();//上限的子类
        BMWELimitUp(fanAllDemo);

        //泛型的受限使用--下限
        //[只要是Number的父类都可以接受(包括本身)]
        FanAllDemo<Number> BMWELimitBottomDemo = new FanAllDemo<>(666666);//下限本身
        BMWELimitBottom(BMWELimitBottomDemo);
        FanAllDemo<Object> objectFanAllDemo = new FanAllDemo<>();//下限的父类
        BMWELimitBottom(objectFanAllDemo);
}

  泛型接口:

泛型接口第一种方式:

新建一个泛型接口

public interface TestInter<T> {
    void InterFan(T jk);
}

新建一个泛型接口实现类

public class TestDemo implements TestInter<String>{
    //泛型接口第一种方式
    @Override
    public void InterFan(String jk) {
        System.out.println(jk);
    }
}

新建一个泛型测试类

public void main(String[] args) {
    //泛型接口的第一种方式
    TestDemo testDemo = new TestDemo();
    testDemo.InterFan("今天好饿");
}

泛型接口第二种方式:

public class Demo {
    public void main(String[] args) {
        //泛型接口的第二种方式
        hh<Integer> integerhh = new hh<>();
        integerhh.InterFanTwo(6666);
    }

    //泛型接口2
    interface TestInterTwo<T>{
        void InterFanTwo(T jk);
    }

    //泛型接口2的实现类
    class hh<T> implements TestInterTwo<T>{

        @Override
        public void InterFanTwo(T jk) {
            System.out.println(jk);
        }
    }
}

【泛型接口2以便方便不在新建文件】

以上便是泛型的基本使用知识,如有漏缺,请在下方评论区留言
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2023-08-10 08:21  九极致之术  阅读(29)  评论(0编辑  收藏  举报