java泛型探索——小特性
泛型特性(小篇幅)
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泛型探索——小特性的更多相关文章
- java泛型探索——介绍篇
1. 泛型出现前后代码对比 先来看看泛型出现前,代码是这么写的: List words = new ArrayList(); words.add("Hello "); words. ...
- java泛型探索——泛型类
本文主要讨论一下如何声明泛型类,讨论的范围涉及构造函数.静态成员.内部类. 构造函数 泛型的类型参数首先声明在首部: public class Pair<T,U> { private fi ...
- 遇到个小问题,Java泛型真的是鸡肋吗?
今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊. 我们经常会遇到要一些自定义的key-value字符串,比如: "key1:1k;key2:2;key3: ...
- 一个小栗子聊聊JAVA泛型基础
背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...
- Java泛型总结
1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...
- Java基础学习总结(83)——Java泛型总结
1. 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型 ...
- java泛型的讲解
java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...
- JAVA 泛型中的通配符 T,E,K,V,?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
- 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...
随机推荐
- 让我的分页类获取sessionFactory
我们知道在Hibernate里比较重要的sessionFactory,经过Spring的管理可以很好地为Spring里注入使用的bean服务(提供数据源的使用),但是,当我们所要使用的类不是像我们尝试 ...
- iOS开发之清除缓存
NSFileManager *mgr = [NSFileManager defaultManager]; NSString *cachePath = [NSSearchPathForDirectori ...
- Java位向量的实现原理与巧妙应用
Java位向量的巧实现原理与巧妙应用 1.博文介绍 本篇博文将会介绍几本的位运算含义.位向量介绍.BitSet实现原理.Java位向量的应用.拓展介绍Bloom Filter等. 2.位运算介绍 1) ...
- 小程序新能力-个人开发者尝鲜微信小程序
个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...
- [麻雀虽小]记 简易Markdown阅读器 开发全过程
[麻雀虽小]记 简易Markdown阅读器 开发全过程 [TOC] 序言 项目地址: https://github.com/didikee/MDReader 测试文章地址: 2017 Android ...
- 自动生成并导出word文档
今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...
- adobe edge animate 和 adobe animate cc 有啥区别?
经常有人问这两款软件的区别,每次都要打字好烦,特此总结发帖如下: 一.首先各自软件介绍 ①adobe edge animate 是adobe公司早期推出的一款网页互动工具.通过HTML+CSS+Jav ...
- 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本
老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- jquery template.js前端模板引擎
作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行 ...
- MYSQL PGA SGA设置
mysql使用总内存 = global_buffers + thread_buffers All thread buffer(会话/线程级内存分配总和) = max_threads(当前活跃连接数) ...