2012-09-21 46 views
7

時,我有一些代碼,需要外部提供的類名,需要構建一個實現了接口的情況下,讓我們把它叫做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. 
    } 
} 

是否有這樣做的更好的辦法?有沒有某種方式可以做到這一點,並不需要明確的禁止警告?

+3

'Class <?擴展Foo>'可能會更好。 –

+1

最初想知道這個問題,但用Class <?替換Class '擴展Foo>'有完全相同的問題。 – Martin

+0

我不是說它會解決任何問題,但是我說它更準確。 –

回答

6

Class.asSubclass

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

如果請求的類不是Foo(或Foo本身)的子類,你會得到一個ClassCastException。換句話說,它和你的解決方案几乎完全一樣。

+0

謝謝!到底是什麼我以後。 – Martin

相關問題