泛型的概念

2023-11-17

一、什么是泛型?

  • 参数化类型
  • 为什么要引入泛型?

1.将不同类型的数据添加到Arraylist中,取出数据要使用时,要进行强制转换(还原-向下转型)。
2.同时在编写程序时,不会报错(无类型安全监测机制)。而结果出错ClassCastException。

泛型

  • 编译时安全监测机制
  • 减少了强制转换操作

1.background

package com.jiang.obj3;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class background {
    public static void main(String[] args) {
        ArrayList arrayList=new ArrayList();
        arrayList.add("java");
        arrayList.add(100);
        arrayList.add(true);
        //1.
        //for (Object o : arrayList) {
        //    存进去,就得取出来用,用的话就得还原本来的类型
        //    String str= (String) o;
        //    java.lang.Integer cannot be cast to java.lang.String
        //    编写时不报错,但是结果报错,很危险----泛型提供编译时类型安全监测机制
        //    System.out.println(str);
        //}

        ArrayList<String> strlist =new ArrayList<>();
        //strlist.add(100); 报错
        //编译期间检查
        //减少强制类型转换
        strlist.add("a");
        strlist.add("b");

        for (String s : strlist) {
            System.out.println(s);
        }
    }


}

1.1结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=63433:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.jiang.obj3.background
a
b

Process finished with exit code 0

2.泛型案例ProductGetter

package com.jiang.obj3;

import java.util.ArrayList;
import java.util.Random;

public class ProductGetter<T> {
    Random random=new Random();

    private T product;

    ArrayList<T> list =new ArrayList<>();

    public  void addProduct(T t) {
        list.add(t);
    }

    //折不是泛型方法
    //采用类的泛型不能用static,因为数据类型没有被确定
    public T getProduct(){
        product = list.get(random.nextInt(list.size()));
        return product;
    }
    //泛型方法如下;
    //右边泛型标识和也应当一样,毕竟返回值是E
    public   <E> E getProduct(ArrayList<E> list){
        return list.get(random.nextInt(list.size()));

    }

    //静态的泛型方法
    public static <T,E,V> void  printtype(T t,E e,V v){
        System.out.println(t+":"+t.getClass().getSimpleName());
        System.out.println(e+":"+e.getClass().getSimpleName());
        System.out.println(v+":"+v.getClass().getSimpleName());
    }

    //可变参数的泛型方法
    public static <E> void print(E...e){
        for (E e1 : e) {
            System.out.println(e1);
        }
    }
 }

2.1测试

  @Test
    public void TestProductGetter(){
        ProductGetter<String> productGetter=new ProductGetter<>();
        String[] product={"苹果手机","华为手机","笔记本","平板"};
        for (String s : product) {
            productGetter.addProduct(s);
        }

        System.out.println("您抽到的奖品为:"+productGetter.getProduct());
        System.out.println("----------------------------------------");

        ProductGetter<Integer> productGetter2=new ProductGetter<>();
        int[] product2={1000,2000,50,10000};
        for (int i : product2) {
            productGetter2.addProduct(i);
        }

        System.out.println("你抽到的奖金为:"+productGetter2.getProduct());
    }

2.2结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=62931:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\test-classes;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\JR2002\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.jiang.obj.Testobj,TestProductGetter
您抽到的奖品为:平板
----------------------------------------
你抽到的奖金为:1000

Process finished with exit code 0

二、泛型类、接口

常用泛型标识: T、E、K、V

泛型类

在这里插入图片描述

3.泛型类Generic02

package com.jiang.obj3;

public class Generic02<T> {
    private T key;

    public Generic02(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }

    @Override
    public String toString() {
        return "Generic02{" +
                "key=" + key +
                '}';
    }

    public void setKey(T key) {
        this.key = key;
    }
}

在这里插入图片描述

3.1 测试

  • Generic02<String> generic02 = new Generic02< >("a");后面的String可以省略;
  • Generic02 generic021 = new Generic02(100);未指定对应的类型的时候,将按照object类型来处理
  • Generic02 generic022=new Generic02(100); 不支持基本数据类型 底层是object转化成(object继承)相应的对象,而int 无
  • 统一泛型,创建不同数据类型的创建的对象是同一类型
   @Test
    public void TestGeneric() {
        Generic02<String> generic02 = new Generic02<String>("a");
        //后部分的string可以省略
        System.out.println(generic02.getKey());

        Generic02 generic021 = new Generic02(100);
        //未指定对应的类型的时候,将按照object类型来处理
        System.out.println(generic021.getKey());

        //Generic02<int> generic022=new Generic02<int>(100);
        //不支持基本数据类型  底层是object转化成(object继承)相应的对象,而int 无


        //统一泛型,创建不同数据类型的创建的对象是同一类型
        System.out.println(generic02.getClass());
        System.out.println(generic021.getClass());
        System.out.println(generic02.getClass() == generic021.getClass());
    }

3.2结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=62583:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\test-classes;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\JR2002\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.jiang.obj.Testobj,TestGeneric
a
100
class com.jiang.obj3.Generic02
class com.jiang.obj3.Generic02
true

Process finished with exit code 0

泛型的继承

在这里插入图片描述

  1. 父类Parent
package com.jiang.obj3;

public class Parent<T> {
    private  T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}

4.1子类是泛型 firstson

  • 泛型子类标识符得一致
package com.jiang.obj3;


//泛型子类继承泛型父类
//泛型标识必须一致
public class firstson<T> extends Parent<T>  {
    @Override
    public void setKey(T key) {
        super.setKey(key);
    }
}

4.2子类不是泛型 secondson

  • 子类不是泛型,父类泛型必须明确类型
package com.jiang.obj3;


//子类不是泛型,父类得明确类型
public class secondson extends Parent<String>{
    @Override
    public void setKey(String key) {
        super.setKey(key);
    }
}

4.3测试

  @Test
    public void TestParent_firstson_secondson(){
        firstson<String> firstso=new firstson<>();
        firstso.setKey("first");
        System.out.println(firstso.getKey());
        System.out.println("----------------------");

        secondson  secondson=new secondson();
        secondson.setKey("second");
        System.out.println(secondson.getKey());
    }

4.4结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=62841:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\test-classes;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\JR2002\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.jiang.obj.Testobj,TestParent_firstson_secondson
first
----------------------
second

Process finished with exit code 0

泛型接口

在这里插入图片描述

5.接口 _interface

package com.jiang.obj3;

public interface  _interface<T> {
    T getkey();
}

在这里插入图片描述

5.1实现类不是泛型 firstinterface

  • 接口明确类型
package com.jiang.obj3;

public class firstinterface implements _interface<String>{

    private String key;

    @Override
    public String getkey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

5.2实现类是泛型 secondinterface

  • 实现类的必须有一个泛型标识和泛型接口一致
package com.jiang.obj3;

//必须有一个泛型标识符相同
public class secondinterface<T,E> implements _interface<T>{
    private T key;
    private E value;

    @Override
    public T getkey() {
        return key;
    }

    public E getValue(){
        return value;
    }

    public void setKey(T key) {
        this.key = key;
    }

    public void setValue(E value) {
        this.value = value;
    }
}

5.3测试

 @Test
    public void TestInterface(){
        firstinterface firstinterface=new firstinterface();
        firstinterface.setKey("first");
        System.out.println(firstinterface.getkey());
        System.out.println("---------------------");

        secondinterface<String,Integer> secondinterface=new secondinterface<>();
        secondinterface.setKey("second");
        secondinterface.setValue(2);

        System.out.println(secondinterface.getkey() + ":" + secondinterface.getValue());
    }

5.4结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=62859:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\test-classes;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\JR2002\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.jiang.obj.Testobj,TestInterface
first
---------------------
second:2

Process finished with exit code 0

泛型方法

在这里插入图片描述
泛型成员方法不是泛型方法

泛型成员方法

  //这不是泛型方法
    //采用类的泛型不能用static,因为数据类型没有被确定
    public  T getProduct(){
        product = list.get(random.nextInt(list.size()));
        return product;
    }

6.泛型方法

  //泛型方法如下;
    //右边泛型标识和也应当一样,毕竟返回值是E
    public   <E> E getProduct(ArrayList<E> list){
        return list.get(random.nextInt(list.size()));

    }

多个泛型参数的泛型方法
成员方法为什么不能static?
假如能调用static成员方法,

  • 类名.static成员方法。X 因为成员方法的类型未被指定,而指定的话是需要靠所在类先指定的。
  • 类型.static方法。 此时同样是未被指定,但是它能够自己指定。

(因为泛型类需要在创建对象时指定类型,而静态方法是通过类名直接调用的,此时成员方法类型未被指定,会报错。)


    //静态的泛型方法
    public static <T,E,V> void  printtype(T t,E e,V v){
        System.out.println(t+":"+t.getClass().getSimpleName());
        System.out.println(e+":"+e.getClass().getSimpleName());
        System.out.println(v+":"+v.getClass().getSimpleName());
    }

可变参数的泛型方法

    //可变参数的泛型方法
    public static <E> void print(E...e){
        for (E e1 : e) {
            System.out.println(e1);
        }
    }

整体

package com.jiang.obj3;

import java.util.ArrayList;
import java.util.Random;

public class ProductGetter<T> {
    Random random=new Random();

    private T product;

    ArrayList<T> list =new ArrayList<>();

    public  void addProduct(T t) {
        list.add(t);
    }

    //这不是泛型方法
    //采用类的泛型不能用static,因为数据类型没有被确定
    public  T getProduct(){
        product = list.get(random.nextInt(list.size()));
        return product;
    }
    //泛型方法如下;
    //右边泛型标识和也应当一样,毕竟返回值是E
    public   <E> E getProduct(ArrayList<E> list){
        return list.get(random.nextInt(list.size()));

    }

    //静态的泛型方法
    public static <T,E,V> void  printtype(T t,E e,V v){
        System.out.println(t+":"+t.getClass().getSimpleName());
        System.out.println(e+":"+e.getClass().getSimpleName());
        System.out.println(v+":"+v.getClass().getSimpleName());
    }

    //可变参数的泛型方法
    public static <E> void print(E...e){
        for (E e1 : e) {
            System.out.println(e1);
        }
    }
 }

6.1 测试

 @Test
    public void Testmethond(){
        ProductGetter<String> productGetter=new ProductGetter<>();
        String[] product={"苹果手机","华为手机","笔记本","平板"};
        for (String s : product) {
            productGetter.addProduct(s);
        }
        //成员方法
        System.out.println(productGetter.getProduct());
        System.out.println("--------------------------------------------");

        ArrayList<String> list=new ArrayList<>();
        list.add("苹果手机");
        list.add("华为手机");
        list.add("笔记本电脑");
        list.add("平板");
        System.out.println("您获得的奖品是:"+productGetter.getProduct(list)+"("+productGetter.getProduct(list).getClass().getSimpleName()+")");


        ProductGetter.printtype(100,"java",true);
        ProductGetter.print(1,2,3,4,56);
        ProductGetter.print("A","B","C");
    }

6.2结果

"C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=63333:D:\IDEA\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit5-rt.jar;D:\IDEA\IntelliJ IDEA 2020.3.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;D:\IDEA_Project\XML\target\test-classes;D:\IDEA_Project\XML\target\classes;C:\Users\JR2002\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\JR2002\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\JR2002\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\JR2002\.m2\repository\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.jiang.obj.Testobj,Testmethond
苹果手机
--------------------------------------------
您获得的奖品是:笔记本电脑(String)
100:Integer
java:String
true:Boolean
1
2
3
4
56
A
B
C

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛型的概念 的相关文章

随机推荐

  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • elasticsearch query 要点

    查看分析效果 godproduct analyze analyzer ik smart text 雅诗兰黛眼霜 简单filter查询 POST myindex mytype search query bool filter term use
  • 常用Web安全扫描工具合集

    初入门时 喜欢将目标站点直接丢扫描器 慢慢等扫描结果 极度依赖Web扫描器 而有一些漏洞高手 善于运用运用各种工具但并不依赖工具 经常可以找到扫描工具发现不了的漏洞 一款好用的Web扫描器对于白帽子来说 就像剑客手中的剑一样重要 那么 如何
  • python os.walk不递归_python-os.walk目录递归

    递归删除文件或目录 递归 os walk 删除目录 shutil rmtree 1 coding UTF 8 2 importos path sys shutil3 4 path H test 5 6 7 for root dirs fil
  • 敏捷之旅大连站2012第一次筹备会议记录

    昨天召集了敏捷之旅大连站的几位组织者 一起开了一个筹备的讨论会 简单记录如下 1 地点的讨论 目前有几个地点备选 东软会议中心 腾飞软件园的会议厅 中荷人寿会议室以及酒店 综合各种因素 包括地点的交通 午餐的方便程度 场地的大小 音响和投影
  • 2.C++设计模式 - 观察者模式

    class Observer public 构造 Observer 析构 virtual Observer 更新 virtual void updata class Server private 观察者链表 list
  • 微信多客服如何设置快捷回复(高级玩法总结)

    在微信生态 使用公众号小程序等 同时每天会产生很多重复的咨询 如何在微信上实现更高效的快捷回复 把常用语 回答文档等便捷化 标准化对答 避免以往的复制粘贴工作方式 是我们不得不面对的一个问题 应用内回复 全应用回复 个人回复 公共回复 快捷
  • Hadoop - wordCount 实例

    hadoop 创建文件夹存放需要被统计的文件 hadoop fs mkdir usr 创建单子文件并写入内容 可在网上找几篇英文文章写入 vim word txt 上传到 hdfs hadoop fs put word txt usr 利用
  • C#开发学习~~~“未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)”

    引言 在 C 高阶编程 中文第10版 的2 2 4节中 有这样一段描述 看到这段话 我简单的理解为 只要在程序开始用using语句声明名称空间 就可以在当前名称空间使用声明的这个名称空间中的类和方法 但实践证明我的理解是有些错误的T0T 问
  • [坑]拦截器返回response.getWrite().println方法返回数据不全

    在SpringBoot项目中 前端ajax请求后端 拦截器进行登录拦截判断 如果超时返回false 则给前端返回一段json字符串 private static void returnJson HttpServletResponse res
  • C++ cin 实现循环读入

    习惯了使用while scanf d x 来实现循环读入 但是有时候使用泛型编程的时候就必须使用C 中的cin 但是当我想要实现循环读入的时候却发现有些困难 我们可以看一下下面这个简单的例子 include
  • 使用boost::units库进行信息单位转换的C++示例程序

    使用boost units库进行信息单位转换的C 示例程序 include
  • 电视机尺寸与观看距离

    电视机尺寸是指电视机屏幕对角线的长度 以英寸为单位 1英寸 2 54厘米 而且目前来看大多数液晶电视的标准屏幕比已经变成了宽的是16 9 根据勾股定理 对角线的长度是 337 根号337 开放得出 屏幕高度与对角线的比值就是9 337 一般
  • 【新版】系统架构设计师 - 案例分析 - 信息安全

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 架构 案例分析 信息安全 安全架构 安全模型 分类 BLP模型 Biba模型 Chinese Wall模型 信息安全整体架构设计 WPDRRC模型 各模型安全防范功能 网络安全体系架构设计
  • Linux中创建文件夹,删除文件夹

    Linux中创建目录 mkdir 文件夹 比如 mkdir test 删除文件夹 rm rf 文件夹 比如 rm rf soft vi强制不保存退出命令 q
  • const 定义数组问题

    const keysArr array aaa gt 11111 bbb gt 22222 ccc gt 33333 ddd gt 44444 上面是标准的错误格式 PHP编译不会报详细错误信息 500 查找半天的代码问题 一直未发现错误
  • 解决Jenkins构建前端时node-sass的.node文件下载报错问题的一种方案

    问题背景 公司的npm仓库未跟外网联通 为什么不联通 我也好鸡儿纳闷 使用Jenkins构建前端时 会在下载node sass的 node时报错 默认情况下会从github上去下 node文件 当然也可以通过配置 npmrc文件指定下载路径
  • 浅析Jetty与tomcat区别

    一 Jetty介绍 1 Jetty概述 Jetty是一个开源项目 最初由Mort Bay Consulting公司创建 它的目标是提供一个快速 灵活 可嵌入的Web服务器和Servlet容器 使Java开发人员能够轻松构建高性能的Web应用
  • 如何在 Mac 上录制屏幕?mac录屏教程分享

    您可以为整个屏幕或屏幕上的选定部分录制视频 1 使用 截屏 工具栏 要查看 截屏 工具栏 请同时按下以下三个按键 Shift Command 和 5 您将看到用于录制整个屏幕 录制屏幕的选定部分或拍摄屏幕静态图像的屏幕控制项 录制整个屏幕
  • 泛型的概念

    一 什么是泛型 参数化类型 为什么要引入泛型 1 将不同类型的数据添加到Arraylist中 取出数据要使用时 要进行强制转换 还原 向下转型 2 同时在编写程序时 不会报错 无类型安全监测机制 而结果出错ClassCastExceptio