0
import java.util.List;
import java.util.function.*;

interface SomeTest <T>
{
    boolean test(T n, T m);
}

class MyClass <T>
{
    boolean myGenMeth(T x, T y)
    {
        boolean result = false;
        // ...
        return result;
    }
}

class Timepass
{
    public static void main(String args[])
    {
        SomeTest <Integer> mRef = MyClass <Integer> :: myGenMeth;   //Statement 1

        Predicate <List<String>> p = List<String> :: isEmpty;       //Statement 2
    }
}

私のクエリ

上記のコードでStatement 1は、2 つのコンパイル時エラーが発生します

1- メソッドが見つかりませんmyGenMeth(Integer, Integer)

2-非静的メソッドmyGenMeth(T, T)は静的コンテキストから参照できません

asStatement 2はエラーを表示しません。

1-の違いは何ですか??Statement 1Statement 2

2-どのようにStatement 2うまく機能していますか。

(なぜStatement 1エラーが発生するのかは尋ねていません)。

4

1 に答える 1

1

インスタンス メソッドへのメソッド参照がありますが、特定のインスタンスを指定していないため、インスタンスをパラメータとしてインターフェイス メソッドに渡す必要があります。

testステートメント 2 では、このインスタンスを のメソッドに渡すことができますPredicate

p.test(new ArrayList<>());

ただし、ステートメント 1 ではtest、インスタンスをパラメーターとして取りません。

mRef.test(new MyClass<>(), 1, 2);

これをコンパイルするには、次のSomeTestように変更する必要があります。

interface SomeTest<T> {
    boolean test(MyClass<T> instance, T n, T m);
}

または、メソッド参照が特定のインスタンスを参照するようにすることもできます。その場合、インターフェイス メソッドにそのパラメーターを含める必要はありません。

SomeTest <Integer> mRef = new MyClass<Integer>()::myGenMeth;
mRef.test(1, 2);

Supplier<Boolean> p = new ArrayList<>()::isEmpty;
p.get();
于 2015-07-07T17:04:25.427 に答える