簡體   English   中英

如何在沒有警告的情況下調用構造函數?

[英]How to call a constructor without warnings?

我從這里使用代碼:

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<?>[]但是得到了同樣的警告。 有沒有辦法抑制這種警告?

要消除警告,請更改為

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

要么

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

問題是getConstructor的返回類型是Constructor<T> ,其中TClass類的類型參數。 但是由於編譯器不知道aClass的類型參數,它將發出警告。

getConstructor()方法是通用的。 如果要使用無警告代碼,請添加type參數。 例如,以下行不會產生警告:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM