【发布时间】:2017-02-17 17:58:22
【问题描述】:
我有一个方法可以在数组的参数之间进行选择并返回一个特定的参数。例如,这里是那个方法:
private <T> T selectOnType(T[] selection, T defaultOp){
switch(this.type){
case Resources.TEXT:
return selection[Resources.TEXT];
case Resources.LISTEN:
return selection[Resources.LISTEN];
default:
return defaultOp;
}
}
如何构造一个充满方法引用(即函数指针)的数组,以便能够将该数组传递给上面的这个方法?
我尝试做这样的事情:
java.util.function.Function<Void, Void>[] array = {ClassA::method1, ClassA::method2};
(其中 method1 和 method1 不带参数并返回 void)
但这会引发编译器错误:
不兼容的类型:无效的方法引用,但预期没有参数。
发现:java.lang.Void
原因:实际参数列表和正式参数列表的长度不同
我一直在玩 lambda,例如:
() -> ClassA.method1()
但我无法让它工作。有谁知道我做错了什么并且知道解决这个问题的方法?
编辑: 我在 Stack Overflow 上看到过this,但这是针对 C# 的,我还没有弄清楚如何在 Java 中模仿它。
示例:
假设我有一个Word 类:
public class Word{
private final String text;
private int listenCorrect = 0, textCorrect = 0;
public Word(final String test){
this.text = text;
}
public void incListenCorrect(){
listenCorrect++;
}
public void incTextCorrect(){
textCorrect--;
}
}
最后我有一个Main 课程。在action 方法内(在Main 类中)我想要一个包含这两种方法的数组,以便在type(如下所示)是listen 或text 时在它们之间进行选择:
public class Main{
int type = 0;
public void action(){
Word word = new Word("Hello");
// 'Functions' is used to represent something I tried above (just for demonstration)
Function[] array = {word::incListenCorrect, word::incTextCorrect};
Function picked = selectOnType(array, word::incTextCorrect);
picked.call();
}
/*
* Resources is another class that contains the following values:
* public static final int TEXT = 0;
* public static final int LISTEN = 1;
*/
private <T> T selectOnType(T[] selection, T defaultOp){
switch(this.type){
case Resources.TEXT:
return selection[Resources.TEXT];
case Resources.LISTEN:
return selection[Resources.LISTEN];
default:
return defaultOp;
}
}
}
【问题讨论】:
-
method1和method2是实例方法还是静态方法? -
你的方法不等同于
Function<Void, Void>,而是Runnable -
@ajb 看看我包含的示例;它们是实例方法。
-
使用
Runnable的列表,如List<Runnable> array = Arrays.asList(word::incListenCorrect, word::incTextCorrect);。
标签: java arrays java-8 function-pointers method-reference