時,我有一些代碼,需要外部提供的類名,需要構建一個實現了接口的情況下,讓我們把它叫做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 <?擴展Foo>'可能會更好。 –
最初想知道這個問題,但用Class <?替換Class'擴展Foo>'有完全相同的問題。 –
Martin
我不是說它會解決任何問題,但是我說它更準確。 –