当前位置: 首页 > 面试题库 >

Java类型擦除:强制转换插入规则?

朱高超
2023-03-14
问题内容

关于类型擦除的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)and 的插入(String)。什么时候插入演员表,以及如何选择演员表类型?


问题答案:
  1. MyNode mn = new MyNode(5);

    • 将创建一个实例,MyNode该实例将T接口的通用类型定义NodeInteger
    • 强制转换:开发人员无需强制转换,编译器无需添加强制转换
    • Node n = (MyNode)mn;

    • 这基本上会告诉编译器忘记了泛型类型,T并且在Node没有泛型的情况下完全使用了接口,这将产生以下结果: 想象将泛型T视为java.lang.Object

    • 强制转换:开发人员无需强制转换,编译器无需添加强制转换
    • n.setData("Hello");

    • 将允许您添加任何类型的肥胖对象 ,因为T被作为对象处理(StringInteger,阵列,别的)

    • 强制转换:开发人员无需强制转换,编译器无需添加强制转换
    • Integer x = mn.data;

    • nm.data应该返回一个Integer类型Integer被定义为泛型类型参数TMyNode

    • 但是,由于您使用的是原始类型,因此您可以添加一个String,因此 实例nm.data 保留String
    • 强制转换:开发人员无需强制转换,但是编译器会为您在后台将强制转换添加到Integer,并且由于类型不匹配,您将获得ClassCastException


 类似资料:
  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 问题内容: 我以为Java擦除会在编译时消除泛型类型,但是当我自己对其进行测试时,我意识到在Bytecode中有一些有关泛型类型的信息。 这是我的测试: 我写了2节课: 和 我编译了两个类,并在通用类的某个地方看到了这一行 在非泛型类中: 所以很明显我在字节码中有通用信息,那么这个擦除的东西是什么? 问题答案: 一些通用类型信息存储在属性中。请参阅JLS 4.8 和4.6以及JVM规范4.3.4。

  • 问题内容: 类型擦除应该擦除所有泛型信息…如果是这种情况,那么像GSON这样的库如何使用泛型来确定反序列化为哪种类型? 例如 这将反序列 化为 将反序列化为 因此以某种方式在运行时使用通用信息。 问题答案: 类型擦除不会擦除所有类型信息。它不会从类,字段,返回类型和参数定义中将其删除。保留以下示例中的类型信息: 这是可以通过反射实现的。您可以检查给定的是否是该类,将其强制转换为该类并获取类型信息。

  • 问题内容: 有没有一种方法可以避免类型擦除并获得对类型参数的访问? 我需要了解并使用它来做事。是否可以,如果可以,如何在 不 将类传入构造函数或参数之外的任何地方的 情况下 完成操作? 编辑: 这个问题的主要目的是找出是否有 任何实用的方法 来消除类型擦除。 问题答案: 实际上, 没有 类型擦除的实用方法,因为您不能要求运行时无法访问的内容。当然,假设您同意为实现接口的每个枚举子类化通用类是一个实

  • 本文向大家介绍浅谈Java数值类型的转换与强制转换,包括了浅谈Java数值类型的转换与强制转换的使用技巧和注意事项,需要的朋友参考一下 数值类型之间的转换 6个实心箭头箭头表示无信息丢失的转换; 3个虚箭头表示可能有精度损失的转换. 当使用上面两个数值进行二元操作时,先要将两个操作数转换为同一类型,然后再进行计算. 规则:`两个数中小类型的值将自动转换为大类型的值. 小转大可以,但是大转小会损失精