【问题标题】:How to call a constructor without warnings?如何在没有警告的情况下调用构造函数?
【发布时间】:2013-12-22 23:10:12
【问题描述】:

我使用了here的代码:

public Object loadService() throws Exception {
    ClassLoader parentClassLoader = ServiceReloader.class.getClassLoader();
    ServiceReloader classLoader = new ServiceReloader(parentClassLoader);
    Class aClass = classLoader.loadClass("pl.jcubic.Service");

    Constructor<?> ctor = aClass.getConstructor(new Class[] { String.class });
    return ctor.newInstance(new Object[] { cwd() });
}

(ServiceReloader 是一个扩展 ClassLoader 加载文件 pl/jcubic/Serice.class 的类) (我的 Service 类如何使用两个构造函数,一个带一个参数 String,一个 null 一个)。

当我调用该代码时,我得到了:

init.java:40: warning: [unchecked] unchecked call to getConstructor(Class<?>...) as a member of the raw type Class
        Constructor<?> ctor = aClass.getConstructor(new Class[] { String.class });
                                                   ^
  where T is a type-variable:
    T extends Object declared in class Class
1 warning

我对泛型不是很熟悉,因为当我学习 Java 时,它们并没有包含在该语言中。

我尝试输入Class&lt;?&gt;[],但得到了同样的警告。有没有办法抑制这个警告?

【问题讨论】:

  • 为什么在getConstructornewInstance 中显式使用数组? Varargs 应该让您将它们用作 getConstructor(String.class);newInstance(cwd())
  • @Pshemo 我发现在 SO 的另一个问题中(链接在问题中),您可以对该问题给出更好的答案。

标签: java generics reflection warnings


【解决方案1】:

getConstructor() 方法是通用的。如果您想要无警告代码,请添加类型参数。例如以下行不会产生警告:

Constructor&lt;String&gt; c = String.class.getConstructor();

由于您的方法是泛型的,因此在方法定义中添加类型参数:

public <T> T loadService() throws Exception {
    ............
    Constructor<T> c = clazz.getConstructor(params);
    T obj = c.newInstance(args);
    return obj;
}

【讨论】:

    【解决方案2】:

    要消除警告,请更改为

    Class<?> aClass = classLoader.loadClass("pl.jcubic.Service");
    

    Constructor<?> ctor = ((Class<?>) aClass).getConstructor(new Class[] { String.class });
    

    问题在于getConstructor 的返回类型是Constructor&lt;T&gt;,其中TClass 类的类型参数。但由于编译器不知道aClass 的类型参数,它会警告你。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2019-06-15
      • 2021-11-22
      相关资源
      最近更新 更多