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

Java中任何对象的编译时类型与运行时类型之间有什么区别?

曹景铄
2023-03-14
问题内容

Java中任何对象的编译时间和运行时类型之间有什么区别?我正在阅读《有效的Java》一书,Joshua
Bloch在Item 26中多次提到了数组实例的编译时类型和运行时类型,主要是为了说明抑制强制转换警告有时是安全的。

// Appropriate suppression of unchecked warning
public E pop() {
 if (size == 0)
   throw new EmptyStackException();
   // push requires elements to be of type E, so cast is correct
   @SuppressWarnings("unchecked") E result = (E) elements[--size];
   elements[size] = null; // Eliminate obsolete reference
   return result;
}

在这里,作者正在讨论types数组上下文中的这些不同类型。但是通过这个问题,我想了解compile time typesvs与run time types任何类型的对象之间的区别。


问题答案:

Java是一种静态类型的语言,因此编译器将尝试确定所有内容的类型,并确保所有内容都是类型安全的。不幸的是,静态类型推断固有地受到限制。编译器必须保守,也无法查看运行时信息。因此,即使确实如此,也无法证明某些代码是类型安全的。

运行时类型是指运行时变量的实际类型。希望作为程序员,您比编译器更了解这一点,因此,当您知道这样做是安全的时候,可以取消警告。

例如,考虑以下代码(将不会编译)

public class typetest{
    public static void main(String[] args){
        Object x = args;
        String[] y = x;

        System.out.println(y[0])
    }
}

该变量x将始终具有type String[],但是编译器无法解决该问题。因此,在将其分配给时,需要显式的强制类型转换y



 类似资料:
  • 问题内容: 在Java中,可以具有运行时类型(即创建时的类型)和强制类型(您将其强制转换为的类型)。 我想知道这些类型的 专有 名称是什么。例如 创建为,但声明为。引用每个透视图类型的正确方法是什么? 问题答案: 我认为,区分 对象 (存在于执行时,只是具有执行时间类型)和具有编译时类型的 表达式 (例如变量)之间,这一点很重要。 因此,在这种情况下: 是类型的变量。它在执行时的值是对type对象

  • 问题内容: Java具有泛型,而通过提供了非常强大的编程模型。那么,和Java泛型之间有什么区别? 问题答案: 它们之间有很大的区别。在C ++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,而不必担心键入错误。 上面的方法添加了两个相同类型的对象,并且可以用于具有“ +”运算符的任何类型T。 在Java中,如果要在传递的对象上调用方法,则必须指定一种类型,例如: 在C

  • 问题内容: 斯卡拉 在Scala中,哪里可以观察到类和类型之间的差异?为什么这种区别很重要? 在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响? 或者是根本,以“固定边界”的类型系统(,来我的心)? 爪哇 在Java中还可以识别出上面提到的许多注意事项/差异/问题? (有关语言的介绍,请参见类型和类之间的区别?。) 问题答案: 当您说“类型”时,我将假设您主要是指静态类型。但是我

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么两者之间有什么区别? 和 问题答案: 匹配项的实例,但不是。假设您要编写一个接受Strings到任何内容的映射的方法:如果您要编写 您无法提供。如果你写

  • 问题内容: 这是过去的考试问题,我想知道什么是原始类型和引用类型?对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型是仅使用int或字符串创建数组的类型。(对?) 您认为您会如何回答测试中的问题并获得良好的信誉?如果没有真正直接引用原始的ARRAY类型,有没有办法做到这一点?还是您只用数组解释一下就可以了。 问题答案: 这些是Java中的原始类型: boolean byte short

  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是