Java中发生了哪些变化,因此教程示例不再准确?

时间:2017-03-15 08:20:38

标签: java generics

我找到了关于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);
    }
}

1 个答案:

答案 0 :(得分:2)

第5行n.setData("Hello");实际上正在调用

public void setData(Integer data) {

带有字符串参数。

这样做将始终抛出该异常(因为String不是整数)。你看,即使在 n 引用上调用方法时也是如此;在运行时,JVM将使用重写方法并调用setData(Integer)

问题是这里的教程并不完全清楚。第6行抛出例外,从未如此。我认为他们想要解释一件事,并编写代码来表达这个想法;但是直到最后都没想到。