我使用了来自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<?>[]
但得到同样的警告。有没有办法压制这个警告?
答案 0 :(得分:5)
要摆脱警告,请转到
Class<?> aClass = classLoader.loadClass("pl.jcubic.Service");
或
Constructor<?> ctor = ((Class<?>) aClass).getConstructor(new Class[] { String.class });
问题是getConstructor
的返回类型为Constructor<T>
,其中T
是Class
类的类型参数。但由于编译器不知道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;
}