-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTest.java
More file actions
175 lines (140 loc) · 4.98 KB
/
Test.java
File metadata and controls
175 lines (140 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package genericity;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 泛型类:
* 1 定义
* 类名后加<T> <T extends String> T:为泛型参数。继承必须使用具体的类 X<T> extends Comparable<String>
* 泛型类型声明:List<String> List<?> List<? extends String> List<? super String>
* 泛型方法:
* <T> void a();
*
* java泛型是通过擦除实现的,擦除为其上边界。
* java类型推导:只在赋值可用。
*
* {@link Type}
* {@link TypeVariable } 类型参数
* {@link ParameterizedType} 参数化的类型
* {@link GenericArrayType} 其成员类型为泛型的数组类型。
* {@link WildcardType} 通配符类型? <? extends T> <? super T>
*
*
* ? 代表任意类型
* ? extends T 代表T及其子类的任意类型
* ? super T 代表T及T父类的任意类型
*
* Class A ,Class B extends A.
* List<A> != List<B>;
* List<? extends A> = List<A>; List<? extends A> = List<B>;List<? extends A> = List<? extends B>
* List<? super B> = List<B>; List<? super B> = List<A>;
* ? extends A != A != B != ? super B;
*
* @author Administrator
*
*/
public class Test {
private List<String> list = new ArrayList<>();
public static void main(String[] args) {
// List<? extends Integer> listUpper = new ArrayList<>();
// testUpperWildcards(listUpper);
//
// List<? super Integer> listLower = new ArrayList<>();
// testLowerWildcards(listLower);
// testMethodParameterType();
testFieldType();
}
/**
* 测试参数化类型
*/
private static void testMethodParameterType() {
Class<Test> cls = Test.class;
try {
Method method = cls.getDeclaredMethod("parameterMethod",List.class);
Type returnType = method.getReturnType();
Type genericReturnType = method.getGenericReturnType();
Parameter[] parameters = method.getParameters();
Type parameterType = parameters[0].getParameterizedType();
printType(parameterType);
printType(genericReturnType);
System.out.println("parameters:" + Arrays.toString(parameters));
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void testFieldType() {
try {
Field field = Test.class.getDeclaredField("list");
Type fieldType = field.getGenericType();
printType(fieldType);
} catch (NoSuchFieldException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static List<List<String>> parameterMethod(List<List<String>> list){
return list;
}
/**
* 测试上边界
*/
public static void testUpperWildcards(List<? extends Integer> list) {
}
/**
* 测试下边界
*/
public static void testLowerWildcards(List<? super Integer> list) {
}
private static void printType(Type type) {
System.out.println("#######################################");
String typeName = type.getTypeName();
System.out.println("typeName:" + typeName);
if(type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType)type;
Type rawType = parameterizedType.getRawType();
Type[] actualTypes = parameterizedType.getActualTypeArguments();
Type ownerType = parameterizedType.getOwnerType();
System.out.println("ParameterizedType rawType " + rawType.getTypeName());
for(Type item:actualTypes) {
System.out.println("ParameterizedType actualType " + item.getTypeName());
}
System.out.println("ParameterizedType ownerType " + ownerType);
}else if(type instanceof TypeVariable) {
TypeVariable typeVariable = (TypeVariable)type;
GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
Type[] bounds = typeVariable.getBounds();
System.out.println("TypeVariable genericDeclaration:" + Arrays.toString(genericDeclaration.getTypeParameters()));
for(Type item:bounds) {
System.out.println("TypeVariable bound " + item.getTypeName());
}
}else if(type instanceof WildcardType) {
WildcardType wildcardType = (WildcardType)type;
Type[] lowerTypes = wildcardType.getLowerBounds();
Type[] upperTypes = wildcardType.getUpperBounds();
for(Type item:lowerTypes) {
System.out.println("WildcardType lowerType " + item.getTypeName());
}
for(Type item:upperTypes) {
System.out.println("WildcardType upperType " + item.getTypeName());
}
}else if(type instanceof GenericArrayType) {
GenericArrayType arrayType = (GenericArrayType)type;
Type componentType = arrayType.getGenericComponentType();
System.out.println("GenericArrayType componentType " + componentType.getTypeName());
}
System.out.println("#######################################");
}
}