泛型特性(小篇幅)

1. 补充介绍一些常见的泛型特性:

类型参数T可以是recursive(类似递归性),它的边界可以是类型参数是自身的接口或类。

如我实现寻找最大值的方法,可以这么写:

public static <T extends Comparable<T>> T max(Collection<T> coll) {
    T candidate = coll.iterator().next();
    for (T elt : coll) {
        if(candidate.compareTo(elt) < 0)
            candidate = elt;
    }
    return candidate;
}

泛型多边界(Multiple Bounds)

    public static<S extends Readable & Closeable, T extends Appendable & Closeable>
    void copy(S src ,T trg, int size) throws IOException {
        try {
         CharBuffer buf = CharBuffer.allocate(size);
         int i = src.read(buf);
         while (i >= 0) {
             buf.flip();
             trg.append(buf);
             buf.clear();
             i = src.read(buf);
         }
        } finally {
            src.close();
            trg.close();
        }
    }

2. Bridges特性

对于泛型接口而言,如Comparable<T>,在编译时会插入额外的方法,这些方法被叫做bridges。

在没有泛型以前,Comparable接口是怎么实现的呢? 我们省略一些代码,简写一下,代码如下:

interface Comparable {
    public int compareTo(T o); }
class Integer implements Comparable {
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
    public int compareTo(Integer i) {
        return (value < i.value) ? -1 : (value == i.value) ? 0 : 1;
    }

    public int compareTo(Object o) {
        return this.compareTo((Integer)o);
    }
}

我们将 compareTo(Object o)方法称为bridge。

泛型接口在jvm编译过程中,就会产生bridge方法,我们就以Comparable<T>为例:

interface Comparable<T> {
    public int compareTo(T o); }
class Integer implements Comparable<Integer> {
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
    public int compareTo(Integer i) {
        return (value < i.value) ? -1 : (value == i.value) ? 0 : 1;
    }
}

我们以Integer为例,它实现了Comparable接口,我们通过反射查看有几个compareTo方法,see:

for (Method m : Integer.class.getMethods()) {
     if (m.getName().equals("compareTo"))
     System.out.println(m.toGenericString());
}

它的输出结果是这样的:

public int java.lang.Integer.compareTo(java.lang.Integer)
public int java.lang.Integer.compareTo(java.lang.Object)

可以看出确实是这样的。至于为什么会这样,接下来慢慢介绍,先留个坑,我们可以先看看bridge方法有什么用处。

3. Covariant Overriding (协变覆盖)

 在java1.4的时候,方法的覆盖必须严格意义上的参数类型和返回类型相同,而java1.5以后,方法的覆盖,只需要参数列表相同,而参数列表是一样的,如果返回类型

是父类的子类,那这个子类的方法也可以overriding父类的方法。

我们以clone方法为例,在Object类中:

class Object {
    ...
    public Object clone() { ... }
}

而在Point类中:

class Point extends Object {
    public int x;
    public int y;
    public Point(int x,int y) {
        this.x = x;
        this.y = y;
    }
    public Point clone() {
        return new Point(x,y);
    }
}

在java1.4之前,上面的clone方法无法覆盖Object的clone方法,但从java1.5开始就可以这么写,这是为什么呢,还是bridge的功劳:

我们在利用反射看看,Point类中有几个clone方方法:

for(Method m : Point.class.getMethods()) {
   if(m.getName().equals("clone"))
System.out.println(m.toGenericString());
}
输出如下:
output
public Point Point.clone() public java.lang.Object Point.clone() throws java.lang.CloneNotSupportedException
java.lang.Object Point.clone()方法只是简单的调用了Point.clone()方法,就这样实现了覆盖。

好了,这些是泛型的零散知识点,先介绍一下,后面继续todo。

java泛型探索——小特性的更多相关文章

  1. java泛型探索——介绍篇

    1. 泛型出现前后代码对比 先来看看泛型出现前,代码是这么写的: List words = new ArrayList(); words.add("Hello "); words. ...

  2. java泛型探索——泛型类

    本文主要讨论一下如何声明泛型类,讨论的范围涉及构造函数.静态成员.内部类. 构造函数 泛型的类型参数首先声明在首部: public class Pair<T,U> { private fi ...

  3. 遇到个小问题,Java泛型真的是鸡肋吗?

    今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊. 我们经常会遇到要一些自定义的key-value字符串,比如: "key1:1k;key2:2;key3: ...

  4. 一个小栗子聊聊JAVA泛型基础

    背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...

  5. Java泛型总结

    1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

  6. Java基础学习总结(83)——Java泛型总结

    1. 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型 ...

  7. java泛型的讲解

    java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...

  8. JAVA 泛型中的通配符 T,E,K,V,?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...

  9. 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?

    原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...

随机推荐

  1. canvas 3D雪花效果

    <!DOCTYPE html> <html style="height: 100%;"> <head> <meta charset=&qu ...

  2. 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  3. 在 WPF 中使用 Path 路径

    在 WPF 中总会修改 Button 的 Style,比如一个自定义的 Close 按钮.刚入门的可能会用一张 PNG 格式的图片来做这个按钮的 Icon,但这个是不优雅的.而且你要改的时候还得去操作 ...

  4. HTML5 的WebSocket

    认识HTML5的WebSocket

  5. Html5 Canvas笔记(3)-Canvas状态

    p{ font-size: 15px; text-indent: 2em; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid ...

  6. 老李分享:jvm结构简介 1

    老李分享:jvm结构简介     poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  7. 整合第二次(SSM第一次)------------>spring+struts2+mybatis

    今天我们来讲解一下SSM整合,感觉整合这个比上一篇整合更费时,原因在于自己不太熟悉MyBatis了,下午的时候恶补了一下,看了一下相关的文档和PDF电子书,知识真的是你不用就会忘记的,以后还是不能懈怠 ...

  8. React-Native 之 项目实战(四)

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...

  9. HNOI2017前被虐记及感悟

    本文所记录的时间以HNOI2017第一天考试时间为DAY1,前一天为DAY0,以此类推. 本文记载了博主从HNOI2017开始前一周进行全真模拟考试的被虐过程和结果.文章内可能包含博主的不良情绪,如果 ...

  10. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...