2015-01-26 50 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

相关问题