当前位置: 首页 > 面试题库 >

如何使用Java中的桥接技术实现协变方法重写

嵇丰
2023-03-14
问题内容

在阅读协变量替代时,我发现一个非常奇怪的事实,

使用桥接技术实现协方差方法覆盖。它还说此功能是在java5及更高版本中实现的。(我认为这是因为从java5引入了泛型)

怎么发生的。请帮我举个例子。


问题答案:

考虑一个例子:

public interface Shape<T extends Shape<T>> {
    T getType();
    void setType(T type);
}

public class Circle implements Shape<Circle> {
    Circle getType() { }
    void setType(Circle circle) {  }
}

到目前为止看起来不错。但是,在擦除类型之后,接口松开了它的泛型类型,并将该类型T替换为上限。因此,接口和类如下所示:

public interface Shape {
    Shape getType();
    void setType(Shape type);
}

public class Circle implements Shape {
    Circle getType() { }
    void setType(Circle circle) {  }
}

现在,这就是问题所在。Circle擦除后的方法实际上不是的重写版本Shape。请注意,现在的方法看上去对所采用的参数和返回的值施加了更大的限制。这是因为擦除会更改接口中方法的签名。

为了解决此问题,编译器为此添加了桥方法,该方法将调用委派给类中的实际方法。

因此,该类实际上已转换为:

public class Circle implements Shape {
    Circle getType() { }
    void setType(Circle circle) {  }

    // Bridge method added by compiler.
    Shape getType() { return getType(); }  // delegate to actual method
    void setType(Shape shape) { setType((Circle)shape); }  // delegate to actual method
}

因此,bridge方法现在是接口中方法的重写版本,并且它们将调用委派给执行任务的实际方法。

注意,在这种情况下,桥接方法中使用的类型是接口类型参数的擦除Shape

参考文献:

  • Java泛型常见问题解答
    • 什么是桥接方法
    • 在什么情况下会生成桥接方法?


 类似资料:
  • 1.     说说 什么是AOP 2.     AOP实现方式 3.     MySQL的默认隔离级别 4.     说说隔离级别有哪些 5.     什么是不可重复读和幻读 6.     乐观锁与悲观锁 7.     公平锁和非公平锁 8.     什么是索引 9.     数据库常见的索引 10.  索引是怎么实现的 11.  说一说线程池 12.  线程池的具体工作过程 13.  线程池的拒

  • 问题内容: 我想在Java中实现方法链接。 我该如何实现? 还请告诉我何时使用它。 我想创建可以按如下方式使用的方法链接: 或喜欢 或喜欢 问题答案: 让你的方法返回如下: 这样,每次调用其中一个方法后,你将获得返回的同一对象,以便可以调用另一个方法。 当你要在对象上调用一系列方法时,此技术很有用:它减少了实现该方法所需的代码量,并允许你在方法链之后使用单个返回值。 减少显示对话框所需的代码量的一

  • 本文向大家介绍Jquery的Ajax技术使用方法,包括了Jquery的Ajax技术使用方法的使用技巧和注意事项,需要的朋友参考一下 Jquery的Ajax技术(重点) jquery是一个优秀的js框架,自然对js原生的ajax进行了封装,封装后的ajax的操作方法更简洁,功能更强大,与ajax操作相关的jquery方法有如下几种,但开发中经常使用的有三种: 1)$.get(url, [data],

  • 问题内容: 我正在开发一个Java Web应用程序,该应用程序通过从Web服务加载的大型XML配置文件来使其行为成为基础。由于在访问应用程序的特定部分之前实际上并不需要这些文件,因此它们会延迟加载。当需要这些文件之一时,查询将发送到Web服务以检索相应的文件。由于某些配置文件可能会被大量使用,因此比其他配置文件使用的频率要高得多,我想设置某种类型的缓存(可能有1小时的过期时间),以避免一遍又一遍地

  • 本文向大家介绍如何使用Java中的lambda和方法引用来实现IntPredicate接口?,包括了如何使用Java中的lambda和方法引用来实现IntPredicate接口?的使用技巧和注意事项,需要的朋友参考一下 IntPredicate接口是java.util.function包中定义的内置功能接口。该功能接口接受一个int值参数作为输入,并产生一个布尔值作为输出。此接口是Predicat

  • 本文向大家介绍使用ajax技术实现txt弹出在页面上的方法,包括了使用ajax技术实现txt弹出在页面上的方法的使用技巧和注意事项,需要的朋友参考一下 使用ajax技术实现点击按钮,将TXT文本里的内容通过弹出框显示到页面上 以上就是使用ajax实现通过弹出窗打开一个text文件。 使用ajax技术实现txt弹出在页面上的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持