我已经读过this SO question,它讨论了Java中类和类型之间的区别
但是,这里讨论的是用class
关键字声明的类,而不是Java中的实际类Class
。在Java中,我可以有一个Class<T>
,其中T是类/接口/数组类型(对于基元,T
是自动装箱的类,但是Class<T>
的实例将被关联具有基本类型,例如int.class)。重点是,Class
不仅用于类类型,而且还可以使用。
答案 0 :(得分:2)
Type
是Class
的超级接口。除非您要对泛型类型进行反射,否则通常不需要使用它。
作为示例,我们可以使用Field.getType()
获取字段的类型:
Class<?> c =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getType();
问题是String.CASE_INSENSITIVE_ORDER
实际上是Comparator<String>
,上面的代码只会给我们Comparator.class
。如果我们需要知道类型参数是什么,这对我们不起作用。
Type
and its uses在Java 1.5(以及泛型)中针对这种情况添加了。我们可以改用方法Field.getGenericType()
:
Type t =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getGenericType();
在这种情况下,它将返回ParameterizedType
的实例,其中Comparator.class
为原始类型,String.class
作为类型参数:
ParameterizedType pt = (ParameterizedType) t;
pt.getRawType(); // interface java.util.Comparator
pt.getActualTypeArguments(); // [class java.lang.String]
API的这一部分开发不够完善,但围绕它构建了一些更好的功能,例如Guava TypeToken
。