Gil*_*ili 3 java generics type-safety
为什么 Java 编译器在转换Class<? extends Object>为时会触发“未经检查的转换”警告Class<Object>?这个演员怎么可能失败?
这样的转换一般来说是不安全的,Class并且无法检测到它对类安全的事实。想象一个这样的类:
// Hypothetical!
class MyClass<T> extends Class<T> {
public T someInstance;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果有问题的演员阵容被允许,你可以做类似的事情
MyClass<Integer> myClassWithInteger = new MyClass<Integer>();
myClassWithInteger.someInstance = someInteger;
// This is valid
MyClass<? extends Object> myClassWithWildcard = myClassWithInteger;
// This is NOT valid, but let's assume it was:
MyClass<Object> myClassWithObject = myClassWithWildcard;
// This would be valid, because 'someInstance' was of type 'Object' here
myClassWithObject.someInstance = "someString";
// This is valid. But through the unchecked cast, we silently
// sneaked in an STRING as this instance. So this would fail:
Integer i = myClassWithInteger.someInstance;
Run Code Online (Sandbox Code Playgroud)
你在评论中问:
你是说语言作者想要避免对 Class 这样的安全类进行特殊处理,所以他们全面禁止这样做吗?
是的。关键在于,这种类型转换是否安全取决于类的语义。在语法上无法检测到安全性。