【问题标题】:What is the difference between the class `Class` and the class `Type` in java?java中的类`Class`和类`Type`有什么区别?
【发布时间】:2019-05-24 09:12:40
【问题描述】:

我读过this SO question,它谈到了java中类和类型之间的区别

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

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

【问题讨论】:

  • 您是否费心阅读文档Class:表示正在运行的 Java 应用程序中的 接口Type:包括原始类型参数化类型数组类型类型变量原始类型Type 是一个接口。 Class 是一个实现该接口的类。可以在Type 的javadoc 中找到。您甚至链接了 javadoc。现在阅读
  • @Andreas 我确实读过,但是文档只提供了技术细节,而下面的答案也提供了实用细节。
  • @Andreas 另外,我已经解释了为什么“原始类型、参数化类型、数组类型、类型变量和原始类型”不清楚:Class<int[]> 是可能的,但同时Class “表示[s] 类和接口”,那么为什么int[] 可以作为类型参数呢?
  • 除了GenericArrayTypeParameterizedTypeTypeVariableWildcardType类型的对象之外,还需要什么其他实用细节不是Class对象,而是都是Type 对象吗?

标签: java class reflection types


【解决方案1】:

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

例如,我们可以使用Field.getType()获取字段的类型:

Class<?> c =
    String.class.getField("CASE_INSENSITIVE_ORDER")
        .getType();

问题是String.CASE_INSENSITIVE_ORDER实际上是一个Comparator&lt;String&gt;,上面的代码只会得到我们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

【讨论】:

  • 我认为由于类型擦除,泛型类型在运行时不可用。我错过了什么吗? ParametrizedType#getActualTypeArguments 怎么判断?
  • 一些泛型类型信息存储在类文件中。否则,当您执行诸如导入库之类的操作时,编译器将无法使用已编译的类文件。类型擦除会影响涉及对象实例的情况:如果您有 ArrayList&lt;String&gt;ArrayList&lt;Double&gt;,则除了检查它们的内容外,无法在运行时区分它们。
猜你喜欢
  • 2017-06-22
  • 2015-07-17
  • 1970-01-01
  • 2020-03-04
  • 2013-02-15
  • 2015-10-04
  • 2014-11-12
  • 2013-02-18
  • 2022-11-09
相关资源
最近更新 更多