[英]Java Type Erasure: Rules of cast insertion?
关于类型擦除的Java 教程似乎并未详细说明编译器强制转换的特定规则。 有人可以解释一下导致本教程详细介绍的转换的特定规则(如下所示):
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);
}
}
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.
具体来说,我想知道是什么规则导致(MyNode)
和(String)
的插入。 什么时候插入演员表,以及如何选择演员表类型?
MyNode mn = new MyNode(5);
MyNode
的实例,该实例将接口Node
的通用类型T
定义为Integer
Node n = (MyNode)mn;
T
并完全使用接口Node
而不使用泛型,这将产生以下结果: 假设将泛型T
视为java.lang.Object
n.setData("Hello");
String
, Integer
,array等) Integer x = mn.data;
nm.data
应该返回一个Integer
类型,因为在MyNode
类中Integer
被定义为泛型类型参数T
String
,所以nm.data
保存了String
实例 ClassCastException
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.