美文网首页
java基础-泛型

java基础-泛型

作者: 16325 | 来源:发表于2020-02-19 12:12 被阅读0次

泛型类

泛型类(generic class) 就是具有一个或多个类型变量的类。一个泛型类的简单例子如下:

//常见的如T、E、K、V等形式的参数常用于表示泛型,编译时无法知道它们类型,实例化时需要指定。
public class Pair <K,V>{
    private K first;
    private  V second;

    public Pair(K first, V second) {
        this.first = first;
        this.second = second;
    }

    public K getFirst() {
        return first;
    }

    public void setFirst(K first) {
        this.first = first;
    }

    public V getSecond() {
        return second;
    }

    public void setSecond(V second) {
        this.second = second;
    }

    public static void main(String[] args) {
    // 此处K传入了Integer,V传入String类型
        Pair<Integer,String> pairInteger = new Pair<>(1, "第二");
        System.out.println("泛型测试,first is " + pairInteger.getFirst()
                + " ,second is " + pairInteger.getSecond());
    }
}

泛型接口

public interface Generator<T> {
    T next();
}

实现类去实现这个接口的时候,可以指定泛型T的具体类型。

public class NumberGenerator implements Generator<Integer> {
    
    @Override
    public Integer next() {
        return new Random().nextInt();
    }
}

泛型方法

具有一个或多个类型变量的方法,称之为泛型方法。

public class GenericMethods {

    public <T> void f(T x){
        System.out.println(x.getClass().getName());
    }

    public static void main(String[] args) {
        GenericMethods gm = new GenericMethods();
        gm.f("字符串");
        gm.f(666);
    }
}

泛型通配符

我们定义泛型时,经常碰见T,E,K,V,?等通配符。本质上这些都是通配符,是编码时一种约定俗成的东西。当然,你换个A-Z中另一个字母表示没有关系,但是为了可读性,一般有以下定义:
+? 表示不确定的 java 类型

  • T (type) 表示具体的一个java类型
  • K V (key value) 分别代表java键值中的Key Value
  • E (element) 代表Element

通配符通常分三类:

  • 无边界通配符,如List<?>
  • 上边界限定通配符,如<? extends E>;
  • 下边界通配符,如<? super E>;

1 注意:?代表任意类型,实际上可以把它看成是一种具体的类型,比如String,Integer
2 T可以出现在,泛型定义,不能用在泛型的具体指定。
3 ?可以看成是String,所以可以用在方法参数中的泛型指定,实例化时的泛型指定。
4 ?可以看成是Object,但是?的泛型指定,不能放入Object

PECS

  • producer extends :用extends定义的泛型T, 取出的时候可以拿到具体类型
  • custmor super: 用super定义的泛型T,存入的时候可以确定具体类型
  • 处理上述两点 extends和super 无其他区别

总结

  • 一定区分泛型的定义,和泛型是使用。
  • 泛型定义:在类上,方法上。
  • 泛型使用:除了上一条的两点,都是泛型使用,包括实例化的成员变量,方法的参数签名,继承父类中的泛型,实现接口中的泛型等。
  • 泛型定义可以用T等不确定的类型
  • 泛型使用必须用具体类型或者?来指定所需类型
  • public static <T> T getBean(String name){
    return (T)applicationContext.getBean(name);
    }
    这个定义了泛型方法,但是参数中并没有T。效果是可以返回任意类型,反编译后,在调用方会加上强制转换

相关文章

  • Java 泛型

    导读 移动开发知识体系总章(Java基础、Android、Flutter) 为什么会有泛型? 泛型类 泛型方法 泛...

  • Java泛型教程

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

  • Java基础之泛型

    Java基础之泛型 泛型基本介绍 简单介绍在jdk1.6之前,还没有使用到泛型,Java类型分为原始类型、复杂类型...

  • spring 泛型处理

    java 泛型基础 泛型类型:泛型类型是在类型上参数化的泛型类或接口 泛型使用场景编译时前类型检查。定义为 Col...

  • Java泛型基础

    Java泛型基础 1. 认识泛型 泛型是在JDK1.5之后增加的新功能. 泛型可以解决数据的安全性问题, 主要的原...

  • 一文带你认识Java泛型基础

    Java泛型基础 1. 认识泛型 泛型是在JDK1.5之后增加的新功能. 泛型可以解决数据的安全性问题, 主要的原...

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • Java基础(一)

    Java要点1 JAVA基础 1.对抽象、继承、多态的理解 2.泛型的作用及使用场景 1.Java泛型是JDK1....

  • 详解Java泛型之3——十分钟理解泛型擦除

    前面我们介绍了泛型以及通配符的基础概念,可以参考文章: 详解Java泛型之1——入门泛型必懂的知识点[https:...

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

网友评论

      本文标题:java基础-泛型

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