以下代码取自 Oracle 泛型文档 -
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;
}
}
class MyNode extends Node<Integer> {
public MyNode(Integer data) { super(data); }
public void setData(Integer data) {
System.out.println("MyNode.setData");
super.setData(data);
}
public static void main(String[] args) {
MyNode mn = new MyNode(5);
Node n = mn; // A raw type - compiler throws an unchecked warning
n.setData("Hello");
Integer x = mn.data; // Causes a ClassCastException to be thrown.
}
}
我对这段代码的理解-
Q - 方法被setData
覆盖还是重载?
我的理解 - 因为MyNode
是扩展Node<Integer>
,类型参数的值T
设置为Integer
。
所以类Node
有方法setData(Integer data)
T= Integer 和类MyNode
有方法setData(Integer data)
。
它是压倒一切的,因为签名是相同的。
Q- 即使在擦除之后,方法 setData 是否也会被覆盖? 我的理解 -
在我们擦除<T>
set 方法之后,Node
变成了,setData(Object data)
并且 set 方法Mynode
将是 -setData(Integer data)
因为没有类型参数,所以没有什么可删除的。
但这是超载的。
问 - 我们想要重载还是覆盖?
我的理解 - 从擦除之前定义的方法的外观来看,我们想要覆盖.
Q - 那么如何在擦除后实现覆盖?
我的理解 - 通过桥接方法。例如:
setData(Object data){
setData((Integer) Data);
}
我的理解正确吗?
另外, class MyNode extends Node<Integer>
什么时候Integer
传递给<T>
?什么时候调用超级?