泛型桥法 - 关于多态性

时间:2014-07-30 15:27:56

标签: java generics

我试图理解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)); 
  1. 将从MyNode,setData(整数数据)或setData(对象数据)调用哪个方法?

  2. 当从类MyNode中的setData(整数数据)调用super.setData(data)时,如何解析它,因为由于Type Erasure,超类节点中没有setData(Integer int)? 似乎解释的多态性问题在编译器插入Bridge方法之后仍然存在。任何帮助/解释都非常感谢。谢谢!

1 个答案:

答案 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)