实例方法

时间:2015-07-07 11:56:14

标签: java method-reference

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产生错误)。

1 个答案:

答案 0 :(得分:1)

因为您对实例方法有方法引用,但没有指定任何特定实例,所以需要将实例作为参数传递给接口方法。

对于语句2,您可以将此实例传递给test的{​​{1}}方法:

Predicate

但对于陈述1,p.test(new ArrayList<>()); 并未将实例作为参数:

test

要进行此编译,需要将mRef.test(new MyClass<>(), 1, 2); 更改为:

SomeTest

或者,您可以使方法引用引用特定实例,然后接口方法不需要包含该参数:

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