java桥_java 泛型--桥方法

因为 java 在编译源码时, 会进行 类型擦除, 导致泛型类型被替换限定类型(无限定类型就使用 Object). 因此为保持继承和重载的多态特性, 编译器会生成 桥方法.

本文最后附录所有源码.

Pair 是个泛型类, 它具有泛型方法 setSecond(T second),

在经过编译时的 类型擦除 后变为 setSecond(Object second).

DateInterval 是 Pair 的实例化子类, 它具有方法 setSecond(LocalDate second).

在 Main.main 中, 我们新建 DateInterval 对象, 并用基类 Pair 来引用它,

此时调用基类的 setSecond 方法时, 我们希望它能够实现多态, 即调用 DateInterval.setSecond(LocalDate) 方法.

事实上, java 编译器通过插入 桥方法 的方式, 帮助我们实现了该功能.

反编译 DateInterval.class 会发现它具有两个 setSecond 方法:

void setSecond(LocalDate);

void setSecond(Object).

并且, 在 void setSecond(Object) 中会调用 void setSecond(LocalDate), 这就是所谓的桥方法.

附: DateInterval.class 反编译后的代码:

Compiled from "DateInterval.java"

public class com.book.chapter8.DateInterval extends com.book.chapter8.Pair {

public com.book.chapter8.DateInterval();

Code:

0: aload_0

1: invokespecial #1 // Method com/book/chapter8/Pair."":()V

4: return

public void setSecond(java.time.LocalDate);

Code:

0: aload_1

1: aload_0

2: invokevirtual #2 // Method getFirst:()Ljava/lang/Object;

5: checkcast #3 // class java/time/chrono/ChronoLocalDate

8: invokevirtual #4 // Method java/time/LocalDate.compareTo:(Ljava/time/chrono/ChronoLocalDate;)I

11: iflt 19

14: aload_0

15: aload_1

16: invokespecial #5 // Method com/book/chapter8/Pair.setSecond:(Ljava/lang/Object;)V

19: return

public void setSecond(java.lang.Object);

Code:

0: aload_0

1: aload_1

2: checkcast #6 // class java/time/LocalDate

5: invokevirtual #7 // Method setSecond:(Ljava/time/LocalDate;)V

8: return

}

附: 其他所有源码:

Pair.java:

package com.book.chapter8;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class Pair {

private T first;

private T second;

public Pair() {

first = null;

second = null;

}

public Pair(T first, T second) {

this.first = first;

this.second = second;

}

public T getFirst() {

return first;

}

public void setFirst(T first) {

this.first = first;

}

public T getSecond() {

return second;

}

public void setSecond(T second) {

this.second = second;

}

}

DateInterval.java:

package com.book.chapter8;

import java.time.LocalDate;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class DateInterval extends Pair {

public void setSecond(LocalDate second) {

if (second.compareTo(getFirst()) >= 0) {

super.setSecond(second);

}

}

}

Main.java:

package com.book.chapter8;

import java.time.LocalDate;

/**

* Created by zhixiao.mzx on 2016/11/5.

*/

public class Main {

public static void main(String[] args) {

DateInterval interval = new DateInterval();

Pair pair = interval;

pair.setFirst(LocalDate.now());

pair.setSecond(LocalDate.now());

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1378):express静态资源处理

const express require(express); const pathrequire(path); const app express();app.use(express.static(path.join(__dirname))) app.listen(3000); console.log(服务器启动成功);

json字符串生成C#实体类的工具

转载:http://www.cnblogs.com/finesite/archive/2011/07/31/2122984.html json作为互联网上轻量便捷的数据传输格式,越来越受到重视。但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率。JSON C# Class Generator 能将json格式所表示的J…

java 栈 泛型_java 泛型栈(数组实现) | 学步园

尝试将一些数据结构用java实现,尝试过程中确实碰到一些问题,收获很大import java.lang.reflect.Array;class ArrayStack {Class type;private T[] values;private int maxSize;private int top;public ArrayStack(Class type, int maxSize) {this.type …

移动web资源整理

2013年底接触移动端,简单做下总结,首先了解下移动web带来的问题 设备更新换代快——低端机遗留下问题、高端机带来新挑战浏览器厂商不统一——兼容问题多网络更复杂——弱网络,页面打开慢低端机性能差——页面操作卡顿HTML5新技术多——学习成…

《Python核心编程》笔记 Python对象

1、Python对象 Python使用对象模型来存储数据,构造任何类型的值都是一个对象。所有的对象都有三个特性: 身份,可通过内建函数id()查看,这个值即该对象的内存地址。类型,可通过内建函数type()查看。值,对象表…

前端学习(1382):多人管理项目2案例初始化

blog.js const express require(express);const app express();const home require(./homegeyao); const admin require(./admingeyao);app.use(/home, home); app.use(/admin, admin); app.listen(3000);console.log(服务器启动成功); admingeyao.js //管理页面 //展示…

codeforces C. Xor-tree

http://codeforces.com/problemset/problem/430/C 题意:在一棵上有n个节点,有n-1条边,在每一个节点上有一个值0或1,然后给你一个目标树,让你选择节点,然后把节点的值翻转,它的孙子节点跟着翻转&…

java jsp ajax_ajax的json传值方式在jsp页面中的应用

jsp页面:$(document).ready(function() {setInterval(function myTimer(){//alert(a);getViews();},1000);});//播放function getViews(){$.ajax({url:"${pageContext.request.contextPath}/video/getVideos.action?r"Math.random()"&open1&quo…

前端学习(1383):多人管理项目3

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path);//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是什么 app.set(view engine…

梁世豪的读书计划

在软工王老师的建议下,我在本学期要认真阅读《梦断代码》 ,《你的灯亮着吗》和《大道至简》这三本可以让我受益匪浅的经典图书。 我的大三下学期软件工程课下相关图书阅读计划: 清明假前的这一个月期间内读完必读书目《梦断代码》。 劳动节前的一个月内看…

java 运算优先级_Java-运算符优先级

我们先后学习了不同的运算符,通过运算符我们的能进行各种不同的操作实现自己的想要的效果,但是此时还存在一个问题,当在一个表达式中,有可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象。由于表达式有多种运算&a…

前端学习(1384):多人管理项目4资源的路径

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path);//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是什么 app.set(view engine…

mysql中新建不了查询语句_将excel和mysql建立链接后,如何通过在excel里面执行mysql查询语句,然后建立查询...

启动excel,点击data选项卡,在这个选项卡下选择new query,from other sources,form odbc然后点击advanced options选项,填入如下查询语句select * from test1.biao1;解释一下:test1是我的mysql一个数据库的名字&#xf…

前端学习(1385):多人管理项目5抽离

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path);//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是什么 app.set(view engine…

第三篇——第二部分——第六文 监控SQL Server镜像

第三篇——第二部分——第六文 监控SQL Server镜像 原文:第三篇——第二部分——第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203要优化,首先要监控,看看是否有性能问题,如果有&a…

java 字符过滤器_Java Web---登录验证和字符编码过滤器

什么是过滤器?在Java Web中,过滤器即Filter。Servlet API中提供了一个Filter接口(javax.servlet.Filter)。开发web应用时,假设编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter。通过Filter技术,开发者能…

前端学习(1386):多人管理项目6骨架

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path);//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是什么 app.set(view engine…

Error applying BeanValidation relational constraints错误的解决

错误示例:Exception in thread "main" org.hibernate.HibernateException: Error applying BeanValidation relational constraintsat org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.…

前端学习(1387):多人管理项目7登录 数据库连接

blog.js const express require(express); //创建网站服务器 const app express(); //开放静态资源文件 const path require(path); require(./model/connect)//告诉express框架模板所在的位置 app.set(views, path.join(__dirname, views)); //告诉express框架模板的后缀是…