避免在使用反射时对泛型类型发出未经检查的强制转换警告

Avoid Unchecked cast warning to generic Type when using reflection

提问人:Teddy Tsai 提问时间:10/25/2022 最后编辑:Teddy Tsai 更新时间:10/25/2022 访问量:102

问:

我有一段代码,看起来像这样,

该字段是来自源代码的私有静态最终 HashMap,我需要对其进行修改。

void <T extends MyInterface> registerMyClass (Class<T> myClass) throws NoSuchFieldException, 
                                                                       IllegalAccessException, 
                                                                       ClassCastException {

    Field field = SomeClass.class.getDeclaredField(FIELD_NAME);
    field.setAccessible(true);
    Map<Class, Collection<Class<?>>> map = (Map<Class, Collection<Class<?>>>) field.get(null);
    Collection<Class<?>> classes= map.computeIfAbsent(KeyClass.class, k -> new LinkedList<>());
    
    if (!classes.contains(myClass)) {
        services.add(myClass);
    }

}

我想在不收到不符合合并请求要求的未选中警告的情况下执行此操作。

有没有一种方法可以在不引起未经检查的强制转换警告的情况下实现相同的结果?

编辑:

我应该更清楚地表述这个问题,我需要做的是在不执行未经检查的强制转换的情况下修改私有静态最终哈希图中的值,该字段来自源文件,因此我无法修改处理它的方法,所以我求助于反思。

基本上现在它可以工作,但我无法合并代码,因为它太丑了:(并且没有通过自动代码检查,所以我需要一些其他方法。

Java 反射 转换

评论


答:

0赞 nyname00 10/25/2022 #1

您将无法摆脱演员表本身的警告。您唯一能做的就是使用注释来抑制警告:@SuppressWarnings

...
Field field = SomeClass.class.getDeclaredField(FIELD_NAME);
field.setAccessible(true);

@SuppressWarnings("unchecked")
Map<Class, Collection<Class<?>>> map = (Map<Class, Collection<Class<?>>>) field.get(null);

Collection<Class<?>> classes= map.computeIfAbsent(KeyClass.class, k -> new LinkedList<>());
...    

评论

0赞 Teddy Tsai 10/25/2022
对不起,我应该更清楚地表述这个问题,这确实抑制了警告,但未经检查的强制转换仍然存在,我需要做的是在没有未经检查的强制转换的情况下修改私有静态最终哈希图中的值,该字段来自源文件,所以我无法修改处理它的方法。
1赞 nyname00 10/25/2022
我不认为你可以。你可以投射到地图<?, ?>并从中获取一个对象,但如果不投射,你将无法写作。我没有检查过,但您可以读取整个地图,创建一个包含所有值的新地图,然后将其写回(使用反射)。但这可能会产生很多不良的副作用。
0赞 Teddy Tsai 10/26/2022
是的,不行,如果我要使用反射,就没有办法避免它,猜想现在最好的方法是说服 CI 人员为代码检查破例。