我有一个方法,它接受通配符列表,但也接受 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/