我试图理解Bridge方法创建的概念,并且坚持在Oracle Java Docs上给出的示例。
以下是参考示例
给出以下两个类:
public class Node<T> {
private T data;
public Node(T data) { this.data = data; }
public void setData(T data) {
System.out.println("Node.setData");
this.data = data;
}
}
public class MyNode extends Node<Integer> {
public MyNode(Integer data) { super(data); }
public void setData(Integer data) {
System.out.println("MyNode.setData");
super.setData(data);
}
}
然后它写了正确的类型删除后的类别应该变成如下:
在类型擦除之后,Node和MyNode类变为:
public class Node {
private Object data;
public Node(Object data) { this.data = data; }
public void setData(Object data) {
System.out.println("Node.setData");
this.data = data;
}
}
public class MyNode extends Node {
public MyNode(Integer data) { super(data); }
public void setData(Integer data) {
System.out.println(Integer data);
super.setData(data);
}
}
因此,为了保持多态性,在类MyNode
中输入桥接方法class MyNode extends Node {
// Bridge method generated by the compiler
//
public void setData(Object data) {
setData((Integer) data);
}
public void setData(Integer data) {
System.out.println("MyNode.setData");
super.setData(data);
}
// ...
}
以下是我的问题,关于如何解决多态性? 假设我使用以下代码调用setData
MyNode mn = new MyNode(5);
mn.setData(new Integer(6));
将从MyNode,setData(整数数据)或setData(对象数据)调用哪个方法?
当从类MyNode中的setData(整数数据)调用super.setData(data)时,如何解析它,因为由于Type Erasure,超类节点中没有setData(Integer int)? 似乎解释的多态性问题在编译器插入Bridge方法之后仍然存在。任何帮助/解释都非常感谢。谢谢!
答案 0 :(得分:2)
如果你有像
这样的代码MyNode mn = new MyNode(5);
mn.setData(new Integer(6));
它将调用您已明确声明的方法setData(Integer)
。对于像以下代码来说,事情变得更有趣了:
Node<Integer> mn = new MyNode(5);
mn.setData(new Integer(6));
因为在类型ereasure之后,类Node
没有方法setData(Integer)
,所以将调用方法setData(Object)
。这就是桥接方法发挥作用的地方:
为了调用所需的方法MyNode.setData(Integer)
而不是Node.setData(Object)
(这是预期的多态性),类MyNode
有一个合成桥接方法,它覆盖setData(Object)
和调用setData(Integer)
。