泛型

作者: chrisghb | 来源:发表于2020-01-21 18:28 被阅读0次
  • 泛型:实现了编写一次,万能匹配,又通过编译器保证了类型安全。
  • 泛型最大的好处:可以提高代码的复用性。 以List接口为例,我们可以将String、 Integer等类型放在List中, 如不用泛型, 存放String类型要写个List接口, 存放Integer要写另外一个List接口, 泛型可以很好的解决这个问题。
  • Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。 类型擦除可以简单的理解为将泛型java代码转换为普通java代码。
  • Java采用Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
  • 类型擦除的主要过程如下: 1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2.移除所有的类型参数。

下面是泛型方法的定义

* 参数T
*     第一个 表示是泛型
*     第二个 表示返回的是T类型的数据
*     第三个 限制参数类型为T
[public] [static] <T> T getListFisrt(List<T> data)

说明:使用泛型方法时,至少返回值或参数有一个是泛型定义的

编写泛型类型

泛型还可以定义多种类型。例如,我们希望Pair不总是存储两个类型一样的对象,就可以声明类型<T, K>:

public class Pair<T, K> {
    private T first;
    private K last;
    public Pair(T first, K last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() { ... }
    public K getLast() { ... }
}

使用的时候,需要指出两种类型:

Pair<String, Integer> p = new Pair<>("test", 123);

Java标准库的Map<K, V>就是使用两种泛型类型的例子。它对Key使用一种类型,对Value使用另一种类型

/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
*     1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
*     2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
*     3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
*     4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
 IllegalAccessException{
       T instance = tClass.newInstance();
       return instance;
}
  • extends通配符

作用:对泛型类实例的类型做限制(向下限制)。
使用类似<? extends Number>通配符作为方法参数时表示:
1.方法内部可以调用获取Number引用的方法,例如:

Number n = obj.getFirst();

2.方法内部无法调用传入Number引用的方法(null除外),例如:

obj.setFirst(Number n);

一句话总结:使用extends通配符表示可以读,不能写。

  • super通配符

作用:对泛型类实例的类型做限制(向上限制)。
使用<? super Integer>通配符表示:
1.允许调用set(? super Integer)方法传入Integer的引用;
2.不允许调用get()方法获得Integer的引用。
唯一例外是可以获取Object的引用:

Object o = p.getFirst();

换句话说,使用<? super Integer>通配符作为方法参数,表示方法内部代码对于参数只能写,不能读。

相关文章

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Java 19-5.1泛型

    泛型类定义泛型类可以规定传入对象 泛型类 和泛型方法 泛型接口 如果实现类也无法确定泛型 可以在继承类中确定泛型:

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

网友评论

      本文标题:泛型

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