ParameterizedType,TypeVariable,GenericArrayType,WildcardType
public interface Type是 Java 编程语言中所有类型的公共高级接口。它包括:
- 原始类型:一般意义上的java类,由class类实现(Class<?>)
- 参数化类型:ParameterizedType接口的实现类
- 数组类型:GenericArrayType接口的实现类
- 类型变量:TypeVariable接口的实现类
- 基本类型:int,float等java基本类型,其实也是Class<?>
这些子接口的特性可以在如下单元测试中获得:
public class TypeTest {
static class Model<T> {
String s;
List<String> list;
T[] array;
T t;
Class<? extends Number> num;
}
@Test
public void theClass() throws NoSuchFieldException, SecurityException {
Field f = Model.class.getDeclaredField("s");
Type type = f.getGenericType();
assertTrue(type instanceof Class<?>);
}
@Test
public void theParameterizedType() throws NoSuchFieldException, SecurityException {
Field f = Model.class.getDeclaredField("list");
Type type = f.getGenericType();
assertTrue(type instanceof ParameterizedType);
ParameterizedType parameterizedType = (ParameterizedType)type;
assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]);
}
@Test
public void theGenericArrayType() throws NoSuchFieldException, SecurityException {
Field f = Model.class.getDeclaredField("array");
Type type = f.getGenericType();
assertTrue(type instanceof GenericArrayType);
}
@Test
public void theTypeVariable() throws NoSuchFieldException, SecurityException {
Field f = Model.class.getDeclaredField("t");
Type type = f.getGenericType();
assertTrue(type instanceof TypeVariable);
TypeVariable typeVariable = (TypeVariable)type;
assertEquals(1, typeVariable.getBounds().length);
assertEquals(Model.class, typeVariable.getGenericDeclaration());
assertEquals(Object.class, typeVariable.getBounds()[0]);
assertEquals("T", typeVariable.getTypeName());
}
@Test
public void theWildcardType() throws NoSuchFieldException, SecurityException {
Field f = Model.class.getDeclaredField("num");
Type type = f.getGenericType();
assertTrue(type instanceof ParameterizedType);
ParameterizedType parameterizedType = (ParameterizedType) type;
Type subType = parameterizedType.getActualTypeArguments()[0];
assertTrue(subType instanceof WildcardType);
WildcardType wildcardType = (WildcardType) subType;
assertEquals("? extends java.lang.Number", wildcardType.getTypeName());
Type[] upperBounds = wildcardType.getUpperBounds();
Type[] lowerBounds = wildcardType.getLowerBounds();
assertEquals(1, upperBounds.length);
assertEquals(0, lowerBounds.length);
assertEquals(Number.class, upperBounds[0]);
}
}

浙公网安备 33010602011771号