为什么我们将无界通配符参数化类型称为可验证的?

ben*_*enz 5 java generics

我正在通过AngelikaLangerDoc阅读。经过将近三天的时间,我正在阅读它。在上一课中,我了解到unbounded wild card可以创建的数组。我还研究了称为的无界通配符参数化类型Reifiable types。当我搜索可更改类型的定义时,它指出,其类型信息在运行时已知的类型称为reifiable type。从文章中选择一个代码片段。

Pair<?,?>[] iniPair = new Pair<?,?>[10];
Run Code Online (Sandbox Code Playgroud)

我有以下困惑。

  1. 为什么我们说无界通配符参数化类型称为可验证?
  2. 在上面的示例中,如何知道类型信息?

我知道这是一个基本问题。我只是想让自己复习一下,重新回到泛型的轨道上。谁能详细说明这个问题?

Oli*_*rth 5

从那个网站:

Java 中可具体化的类型只是那些具体化不会产生影响的类型,即不需要任何类型参数的任何运行时表示的类型

通配符参数中没有类型信息,因此擦除不会丢失任何内容。

  • @benz:`Foo&lt;?&gt;` 是所有具体`Foo&lt;T&gt;` 的超类型,因此没有可以从类型中删除的更多信息。(请注意,在不调用未经检查的强制转换警告的情况下执行 `Foo x = ...; Foo&lt;?&gt; y = (Foo&lt;?&gt;)x;` 是有效的。) (2认同)

Pra*_*ker 4

由于 Java 编译器将所有无界类型参数替换为Object.
根据类型擦除

为了实现泛型,Java 编译器将类型擦除应用于:

1. 将泛型类型中的所有类型参数替换为其边界,如果类型参数无边界,则将其替换为 Object。因此,生成的字节码仅包含普通的类、接口和方法。

2.如果需要保持类型安全,则插入类型转换。

3.生成桥接方法以保留扩展泛型类型中的多态性。

根据Javadoc,术语可具体化

可具体化类型是其类型信息在运行时完全可用的类型。这包括基元、非泛型类型、原始类型和未绑定通配符的调用。