java中的Class和Class类型有什么区别?

时间:2018-12-26 00:06:03

标签: java class reflection types

我已经读过this SO question,它讨论了Java中类和类型之间的区别

但是,这里讨论的是用class关键字声明的类,而不是Java中的实际类Class。在Java中,我可以有一个Class<T>,其中T是类/接口/数组类型(对于基元,T是自动装箱的类,但是Class<T>的实例将被关联具有基本类型,例如int.class)。重点是,Class不仅用于类类型,而且还可以使用。

Class和接口Type和有什么区别?我什么时候可以在Java程序中使用Type

1 个答案:

答案 0 :(得分:2)

TypeClass的超级接口。除非您要对泛型类型进行反射,否则通常不需要使用它。

作为示例,我们可以使用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