java 中的泛型

作者: Exception_Cui | 来源:发表于2021-05-10 14:53 被阅读0次

为什么要使用泛型

  • 类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,直接在 编译的就会提示错误。
  • 消除强制类型转换。
  • 提升性能

  • 泛型说白了就是类型占位符

代码演示

泛型类 和泛型成员变量

/**
 * 成员变量 必须和类的泛型一致
 * 区别于泛型方法
 *
 * Created by kumamon on 2021/5/10.
 */
public class Person<T> {

    public T name;


    @Override
    public String toString() {
        return "Person{" +
                "name=" + name +
                '}';
    }
}


/**
 * 成员变量 必须和类的泛型一致  可以使用多个泛型
 * Created by kumamon on 2021/5/10.
 */
public class Person1<K,V,M> {
    public K name;
    public V age;
    public M address;

    public K getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "name=" + name +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}
------------------------------------------------------------------------------------------------
public class FxTest {
    public static void main(String[] args) {
        /**
         *泛型变量
         * 不能自定义泛型,必须使用类的泛型
         */
        Person<String> p = new Person<String>();  //
        p.name = "张三";   //指定了泛型,所以必须是String

        Person1<String, Integer, Float> p1 = new Person1<String, Integer, Float>();  //类的多泛型
        p1.name = "张三";    //指定了泛型   String
        p1.age = 18;         //指定了泛型  Integer
        p1.address = 20.f;   //指定了泛型   Float
    }
}

泛型方法(可以脱离类的泛型)

/**
 * 静态方法 和 成员方法  可以脱离类的泛型,
 * Created by kumamon on 2021/5/10.
 */
class PersonMethod<T> {

    public static <E> void show(E name){   //自定义静态方法自己的泛型,和类的泛型无关
        System.out.println("静态泛型 name:"+name);
    }

    public static <M> M show2(M name){  //自定义静态方法,具有返回值的泛型 ,和类的泛型无关
        System.out.println("返回值静态泛型 name:"+name);
        return  name;
    }

    public <K> void show3(K name){   //自定义成员方法,使用自己的泛型 ,和类的泛型无关
        System.out.println("成员方法自定义泛型 name:"+name);
    }

    public void show4(T name){  //使用了类的泛型,调用是必须和类的泛型一致
        System.out.println("成员方法泛型 name:"+name);
    }
 }
---------------------------------------------------------------------------------------------------------------
public class FxTest {
    public static void main(String[] args) {

        /**
         *泛型方法
         * 可以自定义泛型
         */
        PersonMethod<Integer> personMethod = new PersonMethod<>();//后面的泛型可以省略

        PersonMethod.show("张三");                   //  静态方法虽然泛型类指定了Interger, 但是方法可以自己定义泛型

        String name = PersonMethod.show2("张三");    //同上, 也可以自定义返回值为泛型

        personMethod.show3("张三");                  //成员方法, 同上

        personMethod.show4(123);                     //成员方法 使用了类的泛型,必须为Integer


    }
}

泛型接口(两种方式)

/**
 * Created by kumamon on 2021/5/10.
 */
public interface IPerson<T> {
    abstract void show(T name);
}

------------------------------------------------------------------------------------------
public class PersonImpl implements IPerson<String> {
    @Override
    public void show(String name) {
        System.out.println("实现类直接指定泛型");
    }
}
--------------------------------------------------------------------------------------------
public class PersonImpl2<T> implements IPerson<T>{
    @Override
    public void show(T name) {
        System.out.println("实现类不指定泛型,使用接口泛型");
    }
}


---------------------------------------------
public class FxTest {
    public static void main(String[] args) {
        /**
         *泛型接口
         */
        IPerson person=new PersonImpl();
        person.show("实现类 直接指定泛型");  //必须指定为String    要不然运行时会报错
        //person.show(111);                 因为使用了多态,(编译是看左边的) 接口没有指定泛型,所以编译的时候不报错
        -------------------------------------------------------------------
        IPerson<String> pp=new PersonImpl2<String>();  // 调用方法时候指定泛型
        pp.show("name");      //此处只能为String

    }

泛型檫除(运行阶段移除所有的泛型)

public class FxTest {
    public static void main(String[] args) {
        /**
        *泛型檫除
         * 在运行阶段会将所有的泛型进行移除
         * java中的泛型其实只存在于编译阶段
         *
        */
        Person<String> pp1=new Person<>();
        Person<String> pp2=new Person<>();
        Person<Integer> pp3=new Person<>();
        System.out.println(pp1.getClass() == pp2.getClass()); //true
        System.out.println(pp1.getClass() == pp3.getClass());  //true
}

相关文章

  • JAVA泛型的理解

    泛型大家都接触的不少,但是由于Java历史原因,Java中泛型一直被称为伪泛型,因此对Java中的泛型,有很多不注...

  • Kotlin 泛型

    Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类: 泛型函数: 类型变异 Java 的泛型中,最难理...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • 15、泛型常用特点

    泛型常用特点 泛型是Java SE 1.5之后的特性,《Java 核心技术》中对泛型的定义是: “泛型” 意味着编...

  • 泛型中 ? super T和 ? extends T的区别

    首先, 说到 Java 的泛型, 我们必须要提到的是Java 泛型的类型擦除机制: Java中的泛型基本上都是在编...

  • java 泛型解析

    Java 泛型 1、泛型的精髓是什么 2、泛型方法如何使用 概述: 泛型在java中具有重要地位,在面向对象编程模...

  • Java 泛型

    一、概述 1.1 什么是Java泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型...

  • 泛型(一)

    1. Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化...

网友评论

    本文标题:java 中的泛型

    本文链接:https://www.haomeiwen.com/subject/bbxedltx.html