加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

关于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页面.如果你一直读到最后,你会发现它会说明你所描述的是什么.

这不是一个写得很好的页面;作者说“发生了什么”,当他们的意思是“如果这样的情况那么发生,但我们不会看到这种情况”.他们的语言太松散了.

页面 – 桥接方法的要点 – 解释当你预测的行为(基于泛型实际设计实现)是他们在开始时“建议”时的真实行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读