【问题标题】:Java - List cast to be able to use addAll functionJava - 列表转换能够使用 addAll 函数
【发布时间】:2020-04-02 03:14:11
【问题描述】:

假设我有一个调用某个方法的实体

Object methodVal = ety.getClass().getMethod("someMethod").invoke(ety);

我的目标是将其转换为 List 以便使用 addAll 之类的功能,所以我尝试了

List.class.cast(methodVal).addAll((Collection<?>) Objects.requireNonNull(someValue)); 

//someValue is an Object and I cast it to Collection<?>)

代码运行良好,应用程序仍然可以运行,但是我收到了警告

Unchecked call to 'addAll(Collection<? extends E>)' as a member of raw type 'java.util.List'

我也试过了

((List<?>) methodVal).addAll((Collection<?>) Objects.requireNonNull(someValue));

但是我收到一个错误提示

Required type: Collection <? extends capture of ?>
Provided: Collection <capture of ?>

关于如何修复警告/错误的任何想法?谢谢

【问题讨论】:

标签: java spring-boot reflection


【解决方案1】:

只需取消有关未检查分配的警告,不要使用原始类型。

注解方法:

@SuppressWarnings("unchecked")
void myMethod() {
    // ... code here ...

    ((List<Object>) methodVal).addAll((Collection<?>) Objects.requireNonNull(someValue));

    // ... code here ...
}

或者分配给一个局部变量并在那里注解:

@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) methodVal;

list.addAll((Collection<?>) Objects.requireNonNull(someValue));

【讨论】:

  • 我的问题是,使用该注释是否可以或者是一个好习惯?
  • 有警告的时候真的感觉有问题……
  • @Beginner 当你刚接触 Java 时,你或许应该避免使用反射。警告的重点是,您有一个 Object 类型的引用,但不知道 List 具有哪个实际类型参数。你不能解决这个问题,你能做的最好的就是告诉编译器你理解了这个问题。这是否会成为一个真正的问题,取决于列表的实际类型以及您使用此未经检查的操作添加到列表中的内容。
【解决方案2】:

您可以通过将“methodVal”包装在一个新的 List 实例中来解决这个问题,这样您就可以使用 add all。下面是一些示例代码:

public class Main {


    public static void main(String[] args) throws Exception {
        Test a = new Test();

        Object result = Test.class.getMethod("get").invoke(a);

        List<Object> list = new ArrayList<>((Collection<?>) result);

        list.addAll(List.of(7, 8, 9));

        System.out.println(list);
    }


    static class Test {

        public List<Integer> get() {
            return List.of(1, 2, 3, 4, 5);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2018-07-04
    • 1970-01-01
    • 2013-03-29
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多