gpt4 book ai didi

java - 桥接方法如何工作?

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:43 26 4
gpt4 key购买 nike

我是 java 的新手。我仍然觉得我必须了解很多所以如果这个问题看起来很愚蠢请原谅我。现在我正在浏览 http://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html

在这里我发现了很多困惑。

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);
}

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"); // Causes a ClassCastException to be thrown.
Integer x = mn.data;

}
}

当我运行这段代码时,出现以下错误

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at MyNode.setData(MyNode.java:1)
at MyNode.main(MyNode.java:14)

下面是困惑
1) 为什么显示行号1
2) 如果你通读博客,他们说类型删除将替换类型参数将替换上面的代码,如下所示

public class Node {

private Object data;

public Node(Object data) { this.data = data; }

public void setData(Object data) {
System.out.println("Node.setData");
this.data = data;
}
}

public class MyNode extends Node {

public MyNode(Integer data) { super(data); }

public void setData(Integer data) {
System.out.println(data);
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"); // Causes a ClassCastException to be thrown.
//Integer x = mn.data

}
}

当我运行上面的代码时没有错误,代码运行正常

从文档来看两者 r 相同吗?为什么这种行为不同

现在关于 oop 的另一个最重要的问题是当我们扩展一个类时,当我们调用 super 构造函数时虽然没有创建 super 对象,那么调用 super 有什么用。请解释。

最佳答案

from the documentation both r same ? why this different in behavior

两个代码示例之间存在不同行为的原因是,当您将通用 T 替换为 Object 时,您间接导致 setData() 不再覆盖父类(super class)中的 setData()。由于参数类型不同,您只是在第二个示例中重载它。因此,在第二个示例中,您直接调用采用 Object 的父类(super class)。在第一个示例中,您正在调用采用 Integer 的子类。

when we call super constructor though super object is not created then what is the use of calling super

父类(super class)和子类是同一个对象(其代码分为两个类)。因此调用父类(super class)构造函数来初始化父类(super class)中定义的任何字段。在您的示例中,如果您从未调用过 super(data) 则永远不会设置 this.data。

关于java - 桥接方法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21348555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com