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

如何获取参数化的Class实例

东明德
2023-03-14
问题内容

由于引入了泛型,因此对Class进行了参数化,因此List.class生成Class 。这很清楚。

我无法弄清楚的是如何获取本身已参数化的Class类型的实例,即Class >。像下面的代码片段一样:

public class GenTest {
    static <T> T instantiate(Class<T> clazz) throws Exception {
        return clazz.newInstance();
    }
    public static void main(String[] args) throws Exception {
        // Is there a way to avoid waring on the line below
        // without using  @SuppressWarnings("unchecked")?
        // ArrayList.class is Class<ArrayList>, but I would like to
        // pass in Class<ArrayList<String>>
        ArrayList<String> l = GenTest.instantiate(ArrayList.class);
    }
}

我经常遇到这个问题的变种,但我仍然不知道,是否只是想念一些东西,或者真的没有更好的方法。感谢您的建议。


问题答案:

Class类是一种类型的运行时表示。由于参数化类型在运行时会进行类型擦除,因此Class的类对象将与Class <List <Integer

和Class >相同。

您无法使用.class表示法实例化它们的原因是,这是用于类文字的特殊语法。在Java语言规范特别禁止此语法当类型是参数化的,这就是为什么列表<字符串>的.class是不允许的。



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

  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?

  • 问题内容: 那么,如何在Java中执行以下操作? 该问题专门发生在List.class上,返回的错误是: 问题答案: 你不能 使用最接近您想要的近似值。 这是因为没有,因为在运行时,,,,并且都在Java中的相同。出于种种原因故意进行此操作,这称为类型擦除。

  • 我有一个文件 这个类是一个独立的文件, 这个类被多个其他文件所引用 如何提前hack这个类 让他每次实例化的时候回调给我, 让我知道他实例化了从而运行一些实例化的代码

  • 问题内容: 我迷失在通用丛林中,请帮助我:)我有这样的事情: 据我认为,编译器应该实现,因为它实现了。 为什么会出现此错误? 我该如何工作? ps:如果您对此有更好的标题,请进行更改。我无法弥补。 问题答案: 问题是,您的构造函数需要一个,并且在您的代码中将其推断为。 因此,您应该通过,然后通过。但是您不能像那样直接传递该实例。 但是,您可以通过将类强制转换为所需实例来解决此问题: 请注意,如何首

  • 问题内容: 我正在为SQLException编写通用记录器,我想获取传递给PreparedStatement的参数,该怎么做?我能够得到他们的数量。 问题答案: 简短的回答:不能。 长答案:所有JDBC驱动程序都会将参数值保留在某个地方,但是没有标准的方法来获取它们。 如果要出于调试或类似目的而打印它们,则有几种选择: 创建一个传递JDBC驱动程序(使用p6spy或log4jdbc作为基础),该驱