2015-01-26 85 views
0

考慮下面的代碼:爲什麼Eclipse會抱怨不安全的類型轉換?

public static <T extends SomeObject> List<T> getByClassName(String className) throws GetRecordsException { 
    try { 
     Class<T> clazz = (Class<T>) Class.forName(className).asSubclass(SomeObject.class); 
     return getByClassName(clazz); 
    } catch (ClassNotFoundException e) { 
     throw new GetRecordsException("Failed to get class forName: " + className, e); 
    } 
} 

Eclipse是彰顯投(Class<T>)以下消息:

Type safety: Unchecked cast from Class<capture#2-of ? extends SomeObject> to Class<T>

這是爲什麼,考慮到T應該保證從SomeObject延長在方法簽名?什麼情況下可能存在這將是不安全的?

回答

1

呼叫者的getByClassName指定T是的SomeObject任何子類,但是,這並不具有相同的子類作爲一個由className命名。將<T extends SomeObject>想象爲指示類型變量T是傳遞給方法調用的另一個參數。

因此,例如,一個不安全的用法是foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2") - 這句法是如何明確指定,而不是讓他們來推斷類型參數, - 然後那將會返回一個List<SomeObjectSubclass1>實際上包含SomeObjectSubclass2,一切會成爲一場災難。

你可以安全地做的是讓clazz成爲Class<? extends SomeObject>,然後返回List<? extends SomeObject

相關問題