如何在没有警告的情况下调用构造函数?

时间:2013-12-05 20:11:44

标签: java generics reflection warnings

我使用了来自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<?>[]但得到同样的警告。有没有办法压制这个警告?

2 个答案:

答案 0 :(得分:5)

要摆脱警告,请转到

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

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

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

答案 1 :(得分:0)

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

Constructor<String> c = String.class.getConstructor();

由于您的方法是泛型添加类型参数到方法定义:

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