当前位置: 首页 > 面试题库 >

Java:如何从泛型类型获取类文字?

庄子平
2023-03-14
问题内容

通常,我见过人们像这样使用类文字:

Class<Foo> cls = Foo.class;

但是,如果类型是通用类型,例如List,该怎么办?这可以正常工作,但由于应将List参数化,因此发出警告:

Class<List> cls = List.class

那么为什么不添加一个<?>呢?好吧,这会导致类型不匹配错误:

Class<List<?>> cls = List.class

我想像这样的事情会起作用,但这只是一个普通的语法错误:

Class<List<Foo>> cls = List<Foo>.class

如何获得Class >静态信息,例如使用类文字?

我可以使用@SuppressWarnings("unchecked"),以摆脱在第一个例子中所造成的非参数使用列表,警告的Class<List> cls = List.class,但我宁愿不要。

有什么建议么?


问题答案:

你不能由于类型擦除。

Java泛型仅是对象转换的语法糖。展示:

List<Integer> list1 = new ArrayList<Integer>();
List<String> list2 = (List<String>)list1;
list2.add("foo"); // perfectly legal

泛型类型信息在运行时保留的唯一实例是Field.getGenericType()通过反射询问类成员的情况。

所有这些都是为什么Object.getClass()具有此签名的原因:

public final native Class<?> getClass();

重要的是Class<?>

换句话说,从Java泛型常见问题解答:

为什么没有具体的参数化类型的类文字?
因为参数化类型没有确切的运行时类型表示形式。

类文字表示Class 表示给定类型的对象。例如,类字面量 String.class表示Class 表示类型的对象, String并且与在 Class对象上getClass调用方法时返回的 String对象相同。类文字可用于运行时类型检查和反射。

当在编译过程中将参数化类型转换为字节码时,它们会丢失其类型参数,该过程称为类型擦除。作为类型擦除的副作用,泛型类型的所有实例共享相同的运行时表示,即相应原始类型的实例。换句话说,参数化类型没有自己的类型表示。因此,存在在形成文字类诸如没有意义的List<String>.class, List<Long>.class并且List<?>.class,由于没有这样的Class对象是否存在。只有原始类型List具有一个Class 代表其运行时类型的对象。称为 List.class



 类似资料:
  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我有一个列表,程序是这样的:。有什么方法可以使用T变量获取类的名称(因此我可以从内部知道T是否为String,Socket等)? 编辑:没关系,在这里找到了答案。 问题答案: 简短答案 :您不能。 长答案 : 由于使用Java实现泛型的方式,泛型T在运行时不会保留。您仍然可以使用私有数据成员: 用法示例:

  • 问题内容: 我在使用泛型时遇到麻烦。给出以下示例: 什么 ???应该 ? 不工作… 也不。 不工作… 如果有Java泛型专家,我需要帮助…:/ 问题答案: 由于类型擦除,您可能无法获得除外。你将不得不使用不安全的类型转换投下的-具体而言,将做的工作。

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 我有一个类,它将我的jpa实体转换为到,反之亦然。 当我在方法中进行转换时,返回的是,我需要它是。 是否可以迭代此集合()并获取“to”值? 转炉 转炉生产者

  • 问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方