私は配列の引数の中から選択して特定のものを返すメソッドを持っています。例えば、ここでその方法は:引数渡しのメソッド/関数を含む配列
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};
(法1とmethod1には、引数を取りませんし、voidを返す場合)
をしかし、それは言ってコンパイラエラーがスローされます。
互換性のない型:無効なメソッド参照ですが、引数は不要です。
が見つかりました:
理由をがjava.lang.Void:実際の仮引数リストの長さが異なる
私は、次のようなラムダで遊んでされています:
() -> ClassA.method1()
しかし、私はそれを働かせることができませんでした。誰もが私が間違ってやっていることを知っているとこの問題の解決策を知っていますか?
EDIT: 私はスタックオーバーフローにthisを見てきましたが、これは、C#のためであると私はJavaでそれを模倣する方法を考え出したていません。
例:
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
クラスを持っている:
のは、私がWord
クラスがあるとしましょう。
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'インスタンスメソッドまたは静的メソッドはありますか? – ajb
あなたのメソッドは 'Function'と同じではなく、 'Runnable'になります –
njzk2
@ajb私が含まれている例を見てください。それらはインスタンスメソッドです。 –