2016-08-13 57 views
1

于Java™教程 https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html 给出了一个例子:困惑类型擦除和桥方法

public class Node<T> { 

    public 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); 
    } 
} 

类型擦除后,节点和MYNODE类变成:类型擦除的

public class Node { 

    public 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("MyNode.setData"); 
     super.setData(data); 
    } 
} 

后方法变为setData(Object)MyNode方法变为setData(Integer)

为什么MyNode方法不成为setData(Object)?为什么Integer未被擦除?

回答

0

为什么MyNode方法不能成为setData(Object)?为什么“Integer”不会被删除?

MyNodesetData定义为:

public void setData(Integer data) 

即,它不具有一般类型参数。因此没有东西被抹去。 data的论点仍然是Integer

+0

你是对的。只有Node类具有泛型类型参数。谢谢。 –