[英]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 1
和Statement 2
什么區別?
Statement 2
的運作情況良好。 Statement 1
為何產生錯誤)。 因為您具有對實例方法的方法引用,但未指定任何特定實例,所以需要將實例作為參數傳遞給接口方法。
對於語句2,您可以將此實例傳遞給Predicate
的test
方法:
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.