是什么编译时和Java中的所有对象的运行时类型之间的区别? 我在读有效的Java书和约书亚布洛赫提到关于编译时类型和项目运行时类型的数组实例的主要是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 types
VS 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
总会有型String[]
但是编译器不能算出这个。 因此,可以将其分配给需要的时候有明确的转换y
。
Java是静态类型的。 这意味着,在每一个语言表达(包括变量)具有在编译时,根据该语言的规则已知的类型。 这被称为静态类型(你所说的“编译时类型”)。 Java中的类型是基本类型和引用类型。
此外,在Java运行时每个对象有一个“类”(在这里,“类”包括虚拟阵列“类”),其在运行时是已知的。 的类中的对象的是一个对象与创建的类。
混乱的部分来自以下事实:在Java中每个类(和接口和阵列型)具有对应的参考类型,即具有类(或接口或阵列型)的名称。 引用类型的值是一个参考,它可以是null
或点的一个对象。 Java语言被设计成使得参考类型的参考X
,如果不是null
将始终指向一个对象的类是类 X或其子类(或接口,其类实现界面 X)。
需要注意的是运行时类适用对象 ,但对象不是在Java中值。 类型,在另一方面,适用于变量和表达,是编译时的概念。 的变量或表达可以从未有一个对象的值,因为没有对象类型; 它可以有一个指向一个对象的引用的值。
我想“编译时间类型”为任何类型的变量可以被示出为具有在编译时的。 这将包括类声明,任何超类,以及任何实现的接口。
在运行时,给定的对象仅具有一个最低级别的类; 它可以合法地转换为或分配给该等级的变量,也给它的任何子类或实现的接口的任何变量。 编译器将(通常是这样),您可以将其转换为任何东西,但如果你尝试给一些不合法运行时会抛出异常。
一旦对象被分配给变量,那么,就好像它是变量的类型的编译器将对待它。 因此,另一种使用“编译时间”可能是该变量的类型,你可以通过只要强制转换为不同的类型,你知道中投将是合法的在运行时在编译时得到解决的。
如果我说只有一个类型的,我认为一个变量作为实际底部的“运行时类型”(上?)变量的水平子类; 以它可以投出最低的子类。 但我也经常想到任何对象作为其任何法律类的一个实例。
希望帮助。
文章来源: What is the difference between a compile time type vs run time type for any object in Java?