|
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](01_Generics_for_Reflection.md) |
| 3 | + |
1 | 4 | ## 反射类型是可维持类型
|
2 | 5 |
|
3 | 6 | 反思使程序可以使用物化类型信息。 因此,必要的是,每个类别标记对应于可确定类型。 如果您尝试反映参数化类型,则会获得相应原始类型的指定信息:
|
|
11 | 14 |
|
12 | 15 | 这里整型的类型列表和字符串的类型列表都由同一个类标记表示,其中的类文字被写入 `ArrayList.class`。
|
13 | 16 |
|
14 |
| -由于该类始终表示可重用类型,因此使用不可赋予的类型对类 `Class` 进行参数化没有意义。 因此,使用类型参数生成类的两种主要方法(即 `getClass` 方法和类文本)都被设计为在所有情况下都为类型参数生成可重用类型。 |
| 17 | +由于该类始终表示可重用类型,因此使用不可赋予的类型对类 `Class` 进行参数化没有意义。 因此,使用类型参数生成类的两种主要方法(即 `getClass` 方法和类 |
| 18 | +文本)都被设计为在所有情况下都为类型参数生成可重用类型。 |
15 | 19 |
|
16 |
| -回想一下,编译器专门处理了 `getClass` 方法。 一般来说,如果表达式 `e` 的类型为 `T`,则表达式 `e.getClass()` 的类型为 `Class<extends | T |>`,其中 `| T |` 是类型 `T` 的删除。 这是一个例子: |
| 20 | +回想一下,编译器专门处理了 `getClass` 方法。 一般来说,如果表达式 `e` 的类型为 `T`,则表达式 `e.getClass()` 的类型为 `Class<extends | T |>`,其 |
| 21 | +中 `| T |` 是类型 `T` 的删除。 这是一个例子: |
17 | 22 |
|
18 | 23 | ```java
|
19 | 24 | List<Integer> ints = new ArrayList<Integer>();
|
20 | 25 | Class<? extends List> k = ints.getClass();
|
21 | 26 | assert k == ArrayList.class;
|
22 | 27 | ```
|
23 | 28 |
|
24 |
| -这里表达式 `int` 具有 `List<Integer>` 类型,所以表达式 `int.getClass()` 的类型为 `Class <? extends List>`; 这是因为擦除 `List<Integer>` 会生成原始类型 `List`。`k` 的实际值是 `ArrayList.class`,它的类型为 `Class<ArrayList>`,它确实是 `Class<? extends List>` 的子类型。 |
| 29 | +这里表达式 `int` 具有 `List<Integer>` 类型,所以表达式 `int.getClass()` 的类型为 `Class <? extends List>`; 这是因为擦除 `List<Integer>` 会生 |
| 30 | +成原始类型 `List`。`k` 的实际值是 `ArrayList.class`,它的类型为 `Class<ArrayList>`,它确实是 `Class<? extends List>` 的子类型。 |
25 | 31 |
|
26 | 32 | 类文字也受到限制; 在类文字中为类型提供类型参数甚至在语法上都是无效的。 因此,以下片段是非法的:
|
27 | 33 |
|
|
51 | 57 |
|
52 | 58 | 解析器在这个短语中遇到了很多麻烦,当它到达文件末尾时仍然感到困惑!
|
53 | 59 |
|
54 |
| -此语法问题导致不规则。 在需要可调整类型的其他位置,您可以提供原始类型(例如 `List`)或带有无限制通配符(例如 `List<?>`)的参数化类型。 但是,对于类别令牌,您必须提供原始类型; 甚至不会出现无界的通配符。 在前面的代码中用 `List<?>替换 `List<Integer>` 会导致类似的错误级联。 |
| 60 | +此语法问题导致不规则。 在需要可调整类型的其他位置,您可以提供原始类型(例如 `List`)或带有无限制通配符(例如 `List<?>`)的参数化类型。 但是,对于类 |
| 61 | +别令牌,您必须提供原始类型; 甚至不会出现无界的通配符。 在前面的代码中用 `List<?>替换 `List<Integer>` 会导致类似的错误级联。 |
55 | 62 |
|
56 | 63 | 对类别标记的限制导致一个有用的属性。 无论何处出现类型为 `Class<T>` 的类型,类型 `T` 都应该是可重用的类型。 对于 `T[]` 形式的类型也是如此.
|
57 | 64 |
|
58 |
| - |
59 |
| - |
60 |
| - |
61 |
| - |
62 |
| - |
63 |
| - |
64 |
| - |
65 |
| - |
66 |
| - |
67 |
| - |
68 |
| - |
69 |
| - |
70 |
| - |
71 |
| - |
72 |
| - |
73 |
| - |
74 |
| - |
75 |
| - |
76 |
| - |
77 |
| - |
78 |
| - |
79 |
| - |
80 |
| - |
81 |
| - |
82 |
| - |
83 |
| - |
84 |
| - |
85 |
| - |
86 |
| - |
87 |
| - |
88 |
| - |
| 65 | +《《《 [下一节](03_Reflection_for_Primitive_Types.md) <br/> |
| 66 | +《《《 [返回首页](../README.md) |
0 commit comments