关于Java泛型的Oracle之一的潜在问题
发布时间:2020-12-15 03:01:34 所属栏目:Java 来源:网络整理
导读:我正在审查一个名为“ Effects of Type Erasure and Bridge Methods”的Java泛型Oracle路径,我无法说服自己给出解释.好奇,我在本地测试了代码,我甚至无法重现跟踪解释的行为.这是相关的代码: public class NodeT { public T data; public Node(T data) { th
我正在审查一个名为“
Effects of Type Erasure and Bridge Methods”的Java泛型Oracle路径,我无法说服自己给出解释.好奇,我在本地测试了代码,我甚至无法重现跟踪解释的行为.这是相关的代码:
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); } } Oracle跟踪声明此代码段的以下行为: 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. 在类型擦除后,此代码段应如下所示: MyNode mn = new MyNode(5); Node n = (MyNode)mn; // A raw type - compiler throws an unchecked warning n.setData("Hello"); Integer x = (String)mn.data; // Causes a ClassCastException to be thrown. 我不明白这里使用的演员表或行为.当我尝试使用IntelliJ和Java 7本地运行此代码时,我遇到了这种情况: MyNode mn = new MyNode(5); Node n = mn; // A raw type - compiler throws an unchecked warning n.setData("Hello"); // Causes a ClassCastException to be thrown. Integer x = mn.data; 换句话说,JVM不允许String与setData()一起使用.这对我来说实际上是直观的,它同意我对泛型的理解.由于MyNode mn是用Integer构造的,因此编译器应该使用Integer转换对setData()的每次调用,以确保类型安全(即传入Integer). 有人能否对Oracle踪迹中的这个明显错误有所了解? 解决方法
你误读了Oracle页面.如果你一直读到最后,你会发现它会说明你所描述的是什么.
这不是一个写得很好的页面;作者说“发生了什么”,当他们的意思是“如果这样的情况那么发生,但我们不会看到这种情况”.他们的语言太松散了. 页面 – 桥接方法的要点 – 解释当你预测的行为(基于泛型实际设计实现)是他们在开始时“建议”时的真实行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |