Skip to content
Prev Previous commit
Next Next commit
添加上下文链接
  • Loading branch information
maskleo committed Apr 19, 2018
commit 37a687a77e7cc06184a7f469be5ee46f4f33209c
6 changes: 5 additions & 1 deletion ch07/02_Reflected_Types_are_Reifiable_Types.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](01_Generics_for_Reflection.md)

## 反射类型是可维持类型

反思使程序可以使用物化类型信息。 因此,必要的是,每个类别标记对应于可确定类型。 如果您尝试反映参数化类型,则会获得相应原始类型的指定信息:
Expand Down Expand Up @@ -55,7 +58,8 @@

对类别标记的限制导致一个有用的属性。 无论何处出现类型为 `Class<T>` 的类型,类型 `T` 都应该是可重用的类型。 对于 `T[]` 形式的类型也是如此.


《《《 [下一节](03_Reflection_for_Primitive_Types.md) <br/>
《《《 [返回首页](../README.md)



Expand Down
5 changes: 5 additions & 0 deletions ch07/03_Reflection_for_Primitive_Types.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](02_Reflected_Types_are_Reifiable_Types.md)

## 对原始类型的反思

`Java` 中的每种类型(包括基元类型和数组类型)都具有类文字和相应的类标记。
Expand All @@ -12,3 +15,5 @@

另一方面,`int[].class` 表示具有基本类型 `integer` 的组件的数组的类标记,并且此类标记的类型为 `Class<int[]>`,这是允许的,因为 `int[]` 是引用类型。

《《《 [下一节](04_A_Generic_Reflection_Library.md) <br/>
《《《 [返回首页](../README.md)
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](03_Reflection_for_Primitive_Types.md)

## 一个通用的反射库

正如我们所看到的,粗心使用未经检查的演员阵容可能会导致问题,例如违反广告中的真相原则或不雅暴露原则(参见第 `6.5` 节和第 `6.6` 节)。 最小化使用未经检查的强制转换的一种技术是将它们封装在库中。 该库可以仔细检查以确保其使用未经检查的强制转换是安全的,而调用该库的代码可以没有未经检查的强制转换。 `Sun` 正在考虑添加类似于这里描述的库方法。
Expand All @@ -13,7 +16,7 @@

第一个接受一个对象,找到该对象的类,并返回该类的新实例;这必须与原始对象具有相同的类型。第二个接收数组并返回一个类标记作为其组件类型,如其运行时类型信息所携带的。相反,第三个分配一个新的数组,其组件类型由给定的类标记和指定的大小指定。第四个接受一个数组和一个大小,并且分配一个与给定数组和给定大小具有相同组件类型的新数组;它只是构成对前两种方法的调用。前三种方法中的每一种的代码都包含对 `Java` 反射库中一个或两个相应方法的调用,以及对相应返回类型的未检查转换。

由于各种原因,`Java` 反射库中的方法无法返回足够精确的类型,因此需要未经检查的强制转换。方法 `getComponentType` 位于 `Class<T>` 类中,并且 `Java` 无法将方法的签名中的接收方类型限制为 `Class <T[]>`(尽管如果接收方不是类,该调用会引发异常令牌为数组类型)。 `java.lang.reflect.Array` 中的 `newInstance` 方法必须具有返回类型 `Object` 而不是返回类型 `T[]`,因为它可能会返回基本类型的数组。方法 `getClass` 在类型 `T` 的接收器上调用时返回不是类型为 `Class <? extends T>但类型 `Class <?>`,因为需要擦除以确保类令牌始终具有可调整类型。但是,在每种情况下,未经检查的转换都是安全的,用户可以调用这里定义的四个库例程而不违反铸铁保证。
由于各种原因,`Java` 反射库中的方法无法返回足够精确的类型,因此需要未经检查的强制转换。方法 `getComponentType` 位于 `Class<T>` 类中,并且 `Java` 无法将方法的签名中的接收方类型限制为 `Class <T[]>`(尽管如果接收方不是类,该调用会引发异常令牌为数组类型)。 `java.lang.reflect.Array` 中的 `newInstance` 方法必须具有返回类型 `Object` 而不是返回类型 `T[]`,因为它可能会返回基本类型的数组。方法 `getClass` 在类型 `T` 的接收器上调用时返回不是类型为 `Class <? extends T>` 但类型 `Class <?>`,因为需要擦除以确保类令牌始终具有可调整类型。但是,在每种情况下,未经检查的转换都是安全的,用户可以调用这里定义的四个库例程而不违反铸铁保证。

例7-1。 用于泛型反射的类型安全库

Expand Down Expand Up @@ -70,7 +73,8 @@

一般来说,我们建议如果您需要使用未经检查的强制转换,那么您应该将它们封装到少数库方法中,就像我们在这里所做的那样。 不要让未经检查的代码在您的程序中激增!


《《《 [下一节](05_Reflection_for_Generics.md) <br/>
《《《 [返回首页](../README.md)



Expand Down
6 changes: 5 additions & 1 deletion ch07/05_Reflection_for_Generics.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](04_A_Generic_Reflection_Library.md)

## 泛型的反思

泛型以两种方式改变反射库。 我们已经讨论了反射的泛型,其中 `Java` 为类 `Class<T>` 添加了一个类型参数。 我们现在讨论泛型的反射,其中 `Java`添加了支持访问泛型类型的方法和类。
Expand Down Expand Up @@ -76,4 +79,5 @@

不幸的是,类 `Class` 没有 `toGenericString` 方法,尽管这会很有用。 `Sun` 正在考虑在未来增加这种方法。 同时,所有必要的信息都是可用的,我们将在下一部分解释如何访问它。


《《《 [下一节](06_Reflecting_Generic_Types.md) <br/>
《《《 [返回首页](../README.md)
43 changes: 6 additions & 37 deletions ch07/06_Reflecting_Generic_Types.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](05_Reflection_for_Generics.md)

## 反映泛型类型

反射库提供了一个 `Type` 接口来描述一个通用类型。 有一个类实现了这个接口和四个其他接口来扩展它,对应于五种不同的类型:
Expand All @@ -16,7 +19,7 @@

方法可用于将类的超类和超接口作为类型返回,并访问字段的泛型类型,构造函数的参数类型以及方法的参数和结果类型。

您还可以提取代表类或接口声明或泛型方法或构造函数的形式参数的类型变量。类型变量的类型需要一个参数,并写入 `TypeVariable<D>`,其中 `D` 表示声明类型变量的对象的类型。因此,类的类型变量具有类型 `TypeVariable<Class<?>>`,而泛型方法的类型变量具有类型 `TypeVariable<Method>`。可以说,类型参数是令人困惑的,并不是非常有用。由于它对6.6节中描述的问题负责,因此 `Sun` 可能会在将来删除它。
您还可以提取代表类或接口声明或泛型方法或构造函数的形式参数的类型变量。类型变量的类型需要一个参数,并写入 `TypeVariable<D>`,其中 `D` 表示声明类型变量的对象的类型。因此,类的类型变量具有类型 `TypeVariable<Class<?>>`,而泛型方法的类型变量具有类型 `TypeVariable<Method>`。可以说,类型参数是令人困惑的,并不是非常有用。由于它对 `6.6` 节中描述的问题负责,因此 `Sun` 可能会在将来删除它。

例 `7-5` 使用这些方法打印出与类关联的所有标题信息。这里有两个使用例子:

Expand Down Expand Up @@ -143,39 +146,5 @@

如果 `Type` 接口有一个 `toGenericString` 方法,那么大部分代码都是不必要的。 `Sun` 正在考虑这一改变。





































《《《 [下一节](../ch08/00_Effective_Generics.md) <br/>
《《《 [返回首页](../README.md)