有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么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正在用以下消息突出显示cast(Class<T>)

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

考虑到T应该保证从方法签名中的SomeObject扩展,这是为什么呢?可能存在哪些不安全的情况


共 (1) 个答案

  1. # 1 楼答案

    getByClassName调用方指定TSomeObject的任何子类,但该子类不必与className命名的子类相同。将<T extends SomeObject>视为指示类型变量T是传递给方法调用的另一个参数

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

    您可以安全地将clazz设为Class<? extends SomeObject>,然后返回List<? extends SomeObject