繁体   English   中英

为什么Eclipse为什么抱怨不安全的类型转换?

[英]Why does Eclipse complain about unsafe type casting?

考虑以下代码:

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>

为什么这样做,考虑到应该保证方法签名中的TSomeObject扩展呢? 在不安全的情况下可能会出现什么情况?

调用者 getByClassName指定T是的任何子类SomeObject ,但这并不必须是同一小类由指定的一个className <T extends SomeObject>视为表明类型变量T是传递给方法调用的另一个参数。

因此,例如,不安全的用法将是foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2") -该语法是您显式指定类型参数的方式,而不是让它们被推断-然后返回List<SomeObjectSubclass1>实际上包含SomeObjectSubclass2 ,一切都将是一场灾难。

您可以安全地做的就是让clazz成为Class<? extends SomeObject> Class<? extends SomeObject> ,然后返回List<? extends SomeObject List<? extends SomeObject

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM