gpt4 book ai didi

Java泛型类型删除: runtime type check on the field

转载 作者:行者123 更新时间:2023-12-01 18:30:12 25 4
gpt4 key购买 nike

我正在学习关于泛型的 Java 教程,并使用 http://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html 上的示例。以我自己的方式。

两个类:

public class Node<T> {
private T data;
public Node(T data) {
this.data = data;
}
public void setData(T data) {
this.data = data;
}
}

public class MyNode extends Node<Integer> {
public MyNode(Integer data) {
super(data);
}
public void setData(Integer data) {
super.setData(data);
}
}

由于类型删除,以下代码将编译:

MyNode mn = new MyNode(5);  // 1
Node n = mn; // 2
n.setData("Hello"); // 3

因为第3行实际上是调用类型删除方法Node.setData(Object)。但是会抛出运行时ClassCastException

这是我的实验:我打印出了字段data的类型。在 Node 和 MyNode 中它都是Object

这是我的问题:

  1. Node 有一个 Object 类型,这并不奇怪,因为类型删除。但为什么 MyNode 也有一个用于“数据”的 Object 类型?

  2. 如果 MyNode 的“数据”具有 Object 类型,那么运行时类型检查如何工作? (ClassCastException 异常...)在我看来,MyNode 中的数据类型也已被删除(我的难题#1)。

Java版本:HotSpot 1.8.0_05-b13

最佳答案

I printed out the type of the field data

您可能打印出的是名为“data”的引用类型。它确实设置为Object

But how come MyNode also has an Object type for "data"?

不确定您在谈论哪些数据。局部变量data的引用类型将为Integer,而属性引用类型为Object

If MyNode's "data" has an Object type, how does the runtime type checking work? (The ClassCastException exception...) It seems to me the data type in MyNode has also been erased (my puzzle #1).

当你这样做时:

public void setData(Integer data) {
super.setData(data);
}

Java 编译器只是将其变成这样:

public void setData(Object arg) {
Integer data = (Integer) arg;
//Now you can use "data" refenrence with proper type
super.setData(data);
}

这就是 ClassCastException 的来源。

关于Java泛型类型删除: runtime type check on the field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539244/

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