12


非静的メソッド参照をメソッドにFile::isHidden渡すことは問題
ないが、メソッド参照を非静的メソッドにMyCass::mymethod渡すと、 「非静的メソッドへの静的参照を作成できません」と表示される理由を誰かが説明できますか?

public static void main(String[] args) {
    File[] files = new File("C:").listFiles(File::isHidden); // OK
    test(MyCass::mymethod); // Cannot make a static reference to the non-static method
}

static interface FunctionalInterface{
    boolean function(String file);
}

class MyCass{
    boolean mymethod(String input){
        return true;
    }
}

// HELPER
public static void test(FunctionalInterface functionalInterface){}
4

3 に答える 3

10

非静的メソッドへのメソッド参照には、操作対象のインスタンスが必要です。

メソッドの場合listFiles、引数はFileFilterwithaccept(File file)です。インスタンス (引数) を操作するときに、そのインスタンス メソッドを参照できます。

listFiles(File::isHidden)

これはの省略形です

listFiles(f -> f.isHidden())

なぜあなたは使えないのですtest(MyCass::mymethod)か?操作するインスタンスがないからですMyCass

ただし、インスタンスを作成してから、メソッド参照をインスタンス メソッドに渡すことができます。

MyCass myCass = new MyCass(); // the instance
test(myCass::mymethod); // pass a non-static method reference

また

test(new MyCass()::mymethod);

編集: main メソッドからアクセスできるようにするには、MyCassstatic ( ) と宣言する必要があります。static class MyCass

于 2015-09-16T22:31:41.143 に答える
1

Peter-walser が指摘したように、MyCass::mymethodはインスタンス メソッドであるため、インスタンスをインスタンスに変換する必要がありFunctionます。

staticインターフェース宣言の前にあるだけで、それは静的インターフェースになり、各メソッドが静的インターフェースになるわけではありません。

考えられる解決策は、クラス内のメソッドを static として宣言することです。

class MyCass{
   static boolean mymethod(String input){
       return true;
   }
}

それがどのように機能するかをよりよく理解するために、メソッド参照に相当するコードを考えることができますMyCass::mymethod(上記の修正された の宣言を仮定しますMyClass):

new FunctionalInterface{
  boolean function(String file){
    return MyClass.mymethod(file);
  }
}

元のコードは、次のように変換しようとします。

new FunctionalInterface{
  boolean function(String file){
    return _missing_object_.mymethod(); # mymethod is not static
  }
}

別の可能性はBiFunction 、あなたの代わりにを使用することですFunctionalInterface。その場合、 の最初の引数はapplyオブジェクトになり、2 番目の引数は の引数になりmymethodます。

于 2015-09-17T10:17:04.117 に答える