【发布时间】:2017-08-18 16:18:42
【问题描述】:
所以,我有一段代码是这样的
public static void printStuff(Object[] stuffs, Function<?, String> func) {
for(Object stuff : stuffs) {
String stringStuff = func.apply(stuff);
System.out.println(stringStuff);
// or whatever, what is done with that String is not relevant
}
// ...
这个方法要调用不同类型的数组,对应的func值,例如:
printStuff(arrayOfClasses, (Class<?> c) -> c.getSimpleName());
printStuff(arrayOfStrings, (String s) -> '"' + s + '"');
printStuff(arrayOfObjects, o -> o.toString());
所以我绝对需要我的 stuffs 为Object[],因为它是方法调用中不同类型的第一个公共超类。
在编译时,我得到:
MyClass.java:6: error: incompatible types: Object cannot be converted to CAP#1
String stringStuff = func.apply(stuff);
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
我的猜测是 javac 对我给Function<?, String> 调用的参数咆哮,其类型Object 不是extend Object。
所以我的问题是,如何将Object 参数传递给Function<?, String>?
我可以将接口类型更改为<Object, String>,但它会中断我的其他调用(使用Class[]、String[] 等),这意味着几乎失去了通用性的全部意义,不是吗?
除非有某种方法可以将我的 stuffs 类型更改为 <? extends Object>[] 或泛型类型,而且我很确定这是不可能的。
提前谢谢各位。
编辑:如果我将方法更改为通用方法,即:
public static <U> void printStuff(Object[] stuffs, Function<U, String> func) {
我仍然收到编译错误:
MyClass.java:6: error: method apply in interface Function<T,R> cannot be applied to given types;
String stringStuff = func.apply(stuff);
^
required: U
found: Object
reason: argument mismatch; Object cannot be converted to U
【问题讨论】:
-
你不能
public static <T> void printStuff(T[] stuffs, Function<T, String> func) {吗?? -
不,唉。查看我的编辑
-
您没有按照 RC 的建议更改您的签名。
-
@Maaaatt 哎呀,读得太快了。确实有效——只要我不忘记更改内部
for循环的类型。 Daaang,我很确定类型变量数组是不可能的
标签: java generics lambda functional-interface