【问题标题】:How to use an instance of Class as a generic type? [duplicate]如何将 Class 的实例用作泛型类型? [复制]
【发布时间】:2018-02-05 21:27:55
【问题描述】:

我想在 java 8 中做这样的事情:

public void example(Class clazz) {
    MyClass<clazz> myObj = new MyClass<clazz>();
}

但我得到“找不到符号:符号类 clazz 位置:”

这可能吗?谢谢!

【问题讨论】:

  • 您只能将类型放在&lt;&gt; 中。你不能把变量名放在这里。

标签: java class generics reflection


【解决方案1】:

泛型类型参数必须是类型名称,而不是变量名称。

为你的方法声明一个泛型类型参数,并在你的参数和变量声明中使用它。

public <T> void example(Class<T> clazz) {
    MyClass<T> myObj = new MyClass<T>();
}

通常使用单个大写字母作为类型变量,例如T,方便将它们与普通变量区分开来,例如clazz.

【讨论】:

  • Class&lt;T&gt; clazz 部分有什么用处?
  • @AndreyTyukin 这是在运行时访问类型的标准方法。见How to get a class instance of generics type TGet generic type of class at runtime
  • @AndreyTyukin 你可以从 clazz 和 do newInstance 获取构造函数
  • @rgettman 好的,我想它可能是这样的。谢谢!
  • @anonymouse "你可以从 clazz 和 do newInstance 获取构造函数" 如果你想要这样做,最好传递 Supplier&lt;T&gt;
【解决方案2】:

由于您希望clazz 成为类型,因此您必须将其作为类型参数传递:

public <T> void example() {
    MyClass<T> myObject = new MyClass<T>();
}

【讨论】:

    【解决方案3】:

    你可以这样做:

    public void example() {
        MyClass<Class> myObj = new MyClass<Class>();
    }
    

    你不能把变量放在

    里面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多