我找到了关于Java泛型的精彩教程,并希望尝试这些示例并为自己玩一点。但是,我发现教程说的内容和Java 8平台实际上的内容之间存在差异。现在我很困惑。那是为什么?
即。根据{{3}},tutorial应该在第6行抛出一个ClassCastException。但是,它会在第5行抛出一个,在n.setData("Hello");
附近。
这是代码:
class NodeMain {
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.
}
}
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);
}
}
答案 0 :(得分:2)
第5行n.setData("Hello");
实际上正在调用
public void setData(Integer data) {
带有字符串参数。
这样做将始终抛出该异常(因为String不是整数)。你看,即使在 n 引用上调用方法时也是如此;在运行时,JVM将使用重写方法并调用setData(Integer)
。
问题是这里的教程并不完全清楚。第6行抛出不例外,从未如此。我认为他们想要解释一件事,并编写代码来表达这个想法;但是直到最后都没想到。