簡體   English   中英

將泛型參數綁定到Class時未經檢查的強制轉換<?>

[英]Unchecked cast when bounding the generic parameter to Class<?>

我有一些采用外部提供的類名的代碼,並且需要構造一個實現某些接口的實例,我們稱其為Foo

作為此過程的一部分,我希望具有以下功能:

private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
    return (Class<? extends Foo>) Class.forName(name);
}

顯然,這將導致未經檢查的警告,因為它確實是不安全的-調用者可能已經要求提供“ java.lang.Long”作為我們所知。 我最終希望此方法可以保證,如果不拋出異常,則返回的Class表示Foo實現。

我目前最好的解決方案是:

private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
    Class<?> impl = Class.forName(name);
    if (Foo.class.isAssignableFrom(impl)) {
        @SuppressWarnings("unchecked")
        Class<? extends Foo> foo = (Class<? extends Foo>) impl;
        return foo;
    } else {
        // Throw something - ClassCastException perhaps.
    }
}

有更好的方法嗎? 是否有某種方法不需要顯式抑制警告?

Class.asSubclass

private static Class<? extends Foo> fooFromClassName(String name) throws ... {
    return Class.forName(name).asSubclass(Foo.class);
}

如果請求的類不是Foo的子類(或Foo本身),則將獲得ClassCastException 換句話說,它的功能幾乎與您的解決方案相同。

暫無
暫無

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

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