数组在Java中有所体现

我最近发现,Arrays在Java中有所体现。 也就是说,他们只在运行时知道类型信息。 但我对这个定义有点困惑。

如果说Arrays只在运行时知道类型信息,我应该能够将任何值分配给任何数组,因为只有在运行时才知道输入错误只会在运行时抛出错误。 但实时情况并非如此。 我们得到一个编译时错误。

那么有人可以说明“它是什么意思 – 数组被神化了”?

我认为这意味着给定的代码行将抛出exception:

 String[] arrayOfStrings = new String[10]; Object[] arrayOfObjects = arrayOfStrings; // compiles fine arrayOfObjects[0] = new Integer(2); // throws a runtime exception (ArrayStoreException IIRC) 

数组是协变的:String [] extends Object []。 但是数组的实际类型在运行时是已知的,并且尝试存储不是正确类型的实例会引发exception。

我相信你要找的那个词是可以回复的

由于在运行时类型擦除,可重新类型不会丢失任何类型信息。 可再生类型的示例包括:

  • 原语
  • 非通用引用类型
  • 数组或基元或非generics引用类型的数组。

Reifiable并不意味着在编译时不知道类型。 这意味着什么是类似以下的东西,不能打字检查:

 List[] myList; 

数组包含有关它们存储的类型的运行时信息。 不可反复的类型不能在运行时进行类型检查,这不能使它们成为数组的组件类型的良好候选者。

当使用可再生类型作为数组的组件类型(如String[] ,完整的类型信息在运行时可用,因此可以执行类型检查。

 String[] someArray = new String[2]; //some factory returns Integer upcasted to Object someArray[0] = someFactory.getType("Integer"); //throws RuntimeException 

资料来源:

http://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ106 (好)

如果说Arrays只在运行时知道类型信息,我应该能够将任何值分配给任何数组,因为只有在运行时才知道输入错误只会在运行时抛出错误。 但实时情况并非如此。 我们得到一个编译时错误。

可重构类型在运行时编译时知道它们的类型,这就是为什么编译器仍会阻止你在可能的地方犯下愚蠢的错误(让它们通过的重点是什么?)

但是,有时候编译器不能总是确定一个赋值(例如)是否有效,因为它不知道确切的类型,这就是reified类型可以检查的地方。 例如:

 Object[] arr = new String[5]; arr[0] = 7; 

…这将编译,因为在第二行,编译器只知道数组的静态类型为Object ,而动态类型更具体。 它将在运行时作为exception失败,它只能这样做(因为与通用集合类不同),特定类型在运行时是已知的。

如文档中所述 :

可重新类型是一种类型,其类型信息在运行时完全可用。 这包括基元,非generics类型,原始类型和未绑定通配符的调用。

不可再生类型是在编译时通过类型擦除删除信息的类型 – 未定义为无界通配符的generics类型的调用。 不可重新生成的类型在运行时没有提供所有信息。 不可再生类型的例子是List和List; JVM无法在运行时区分这些类型。 如“generics限制”中所示,某些情况下无法使用不可重新生成的类型:例如,在表达式的实例中,或作为数组中的元素。

所以数组是有效的和协变的,但generics是不变的,并且本质上是类型擦除的。 如果未添加正确类型的元素,则数组提供运行时类型安全性并抛出ArrayStoreexception。