簡體   English   中英

兩種方法對實例方法的引用之間的區別

[英]Difference between the two method references to instance methods

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產生兩個編譯時錯誤

1-找不到方法myGenMeth(Integer, Integer)

2-無法從靜態上下文引用非靜態方法myGenMeth(T, T)

其中, Statement 2沒有顯示錯誤。

1- Statement 1Statement 2什么區別?

2- Statement 2的運作情況良好。

(我不是問Statement 1為何產生錯誤)。

因為您具有對實例方法的方法引用,但未指定任何特定實例,所以需要將實例作為參數傳遞給接口方法。

對於語句2,您可以將此實例傳遞給Predicatetest方法:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM