Java 如何在同一方法中处理多种列表?
我目前拥有具有以下签名的方法: 公共静态列表keepList输入,谓词p 公共静态列表keepList输入,谓词p 公共静态列表keepList输入,谓词p 所有人都做同样的事情。如何在一个方法中处理这三种列表中的任何一种?我已经试过使用通配符了?运算符,但当我执行此操作时,会出现一个错误,即无法将CAP1对象添加到列表中 以下是其中一种方法的示例:Java 如何在同一方法中处理多种列表?,java,Java,我目前拥有具有以下签名的方法: 公共静态列表keepList输入,谓词p 公共静态列表keepList输入,谓词p 公共静态列表keepList输入,谓词p 所有人都做同样的事情。如何在一个方法中处理这三种列表中的任何一种?我已经试过使用通配符了?运算符,但当我执行此操作时,会出现一个错误,即无法将CAP1对象添加到列表中 以下是其中一种方法的示例: public static List<?> keep(List<?> input, Predicate<?>
public static List<?> keep(List<?> input, Predicate<?> p) {
List<?> keepList = new ArrayList<>();
input.stream().filter((i) -> (p.test(i))).forEach((i) -> {
keepList.add(i);
});
return keepList;
}
在此方法中,keepList.addi生成一个错误,该错误表示:
未找到适用于addCAP1的方法
方法Collection.addCAP2不适用
参数不匹配;对象无法转换为CAP2
方法List.addCAP2不适用
参数不匹配;对象无法转换为CAP2
其中,CAP1、CAP2是新类型变量:
CAP1将对象从捕获扩展到
CAP2将对象从捕获扩展到
使用泛型方法
public static <T> List<T> method(List<T> list) {
...
}
如果需要的话,你可以用你对类所做的同样的方式来限制它;例如,T扩展数字或其他任何内容。是的,纯粹基于类型签名,您可以使用泛型来实现这一点。为方法定义一个类型参数,并将其用作每个列表/谓词的类型
public static <X> List<X> keep(List<X> input, Predicate<X> p)
考虑到java.util.function.Predicate的工作方式和方法的名称,这可能足以使您的代码具有通用性,并将3个函数简化为一个函数。这将有助于查看该错误和生成该错误的代码,以及了解该方法的功能。告诉我们他们都做同一件事并不能告诉我们他们实际上做了什么。发布一些代码。