java - 一个接受通配符列表和函数的函数?

标签 java java-8

我有一个方法,它接受通配符列表,但也接受 java.util.function.Function 的实现,该实现接受列表包含的相同类型的元素并返回字符串。为此,我有两个想法,但都不令人满意。

方法 1:使方法通用。

public <T> void method(List<T> list, Function<T, String> function){
    ...
}

方法 2:使函数的第一个类型成为通配符?

public void method(List<?> list, Function<?, String> function){
    ...
}

我不喜欢方法 1,我什至不确定方法 2 是否有效,因为有时我会遇到如下奇怪的错误:

error: incompatible types: Object cannot be converted to CAP#1
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?

是否有其他方法可以创建这样的方法而不保留 Function 参数原始?

最佳答案

使用方法的通配版本

public void method(List<?> list, Function<?, String> function)

这是不可能的,因为 - 正如您已经注意到的 - 使用通配符作为变量的类型是不可能的。

还有另一种使用泛型类型参数的方法。您可以尝试使用

public void method(List<Object> list, Function<Object, String> function)

如果您确实想使用包含多个类实例的列表作为方法的签名,如 list .

但是,如果您只想允许一种类型的元素,那么您肯定必须使用泛型,因此您的方法必须看起来像您已经在问题中显示的那样:

public <T> void method(List<T> list, Function<T, String> function)

如果您的问题是在使用泛型的情况下如何调用您的方法,那就非常简单了。假设你有一个 List<Integer> list 。如果您随后调用method(list,...)list 的泛型类型自动确定function的第一个类型参数,在本例中function必须是 Function<Integer, String> 的实例。由于您想使用 lambda 表达式来调用该方法,例如

method(list, (Integer i) -> (String.valueOf(i)));

完全正确。

关于java - 一个接受通配符列表和函数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338313/

相关文章:

Java - 返回指定泛型类型的列表

java - SWT 复合和组

java - 使用 Netty 的 HTTP 请求

java - 我使用 lambda 列出 mongodb 中的集合索引,但在 eclipse 中出现错误

java - 在 Java8 中连接对象数组列表

java - 如何在带有 lambda 表达式的 Java 8 中使用多个流和 .map 函数

java - Java 是否具有与 C# 类似的对事件的 native 支持?

Java:使用等于覆盖从列表中删除对象

java - 通过 GAE Java 重新使用 GAE Python 代码

带有尾随零的 Java BitSet