如何在 lamda 表达式中使用 super::methodName 引用方法的超类版本

我正在学习 Java 8 中的 Lambda 表达式和方法引用,并看到我们可以通过使用“super”来引用方法的超类版本,如下所示:


超级::名称


但是当我这样做时,它不起作用。这是示例代码:


interface MyInterface {

int someFunc(int x);

}


    class A {

    static int Func(int y) {

        // return (int) (Math.random() * y);

        return y;

    }

}


class B extends A {

    static int Func(int y) {

        // return (int) (Math.random() * y);

        return y + 1;

    }

}


public class Test {

    public static void main(String[] args) {

        System.out.print("Enter a number: ");

        java.util.Scanner scanner = new java.util.Scanner(System.in);

        int result = funcOp(B::Func, scanner.nextInt()); // <-This works.

//int result = funcOp(B.super::Func, scanner.nextInt());  <--This is not working. 

//Getting: error: not an enclosing class: B

            int result = funcOp(B.super::Func, scanner.nextInt());

                                 ^

        scanner.close();

        System.out.println(result);

    }


    static int funcOp(MyInterface mI, int num) {

        return mI.someFunc(num);

    }

}

请告诉我,我执行此代码是否错误?根据我的理解,我们可以传递一个方法“X”作为参考,因为方法“X”满足方法“Y”的条件和行为,并且可能取代方法在那种情况下“Y”。


这是不对的,我是否以错误的方式获得了方法引用?


慕尼黑的夜晚无繁华
浏览 129回答 2
2回答

郎朗坤

从JLS:形式 super.Identifier 指的是当前对象名为 Identifier 的字段,但将当前对象视为当前类的超类的实例。[...]使用关键字 super的形式仅在类的实例方法、实例初始值设定项或构造函数中,或在类的实例变量的初始值设定项中有效。如果它们出现在其他任何地方,则会发生编译时错误。您正在super从类类型调用,因此编译错误。正如许多人在评论中建议的那样,您应该只传递A::Func该funcOp方法。请注意,您也无法super从您的Func方法调用,因为它是一个static方法,因此它不绑定到类实例。编辑以下 OP 的评论您可以使用super实例方法中的关键字(因此,如果您删除静态),它看起来像这样:class B extends A {&nbsp; &nbsp; int Func(int y) {&nbsp; &nbsp; &nbsp; &nbsp; // e.g:&nbsp; &nbsp; &nbsp; &nbsp; if (y > 10) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return super.Func(y); // call Func from the parent class&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return y + 1;&nbsp; &nbsp; }}

一只名叫tom的猫

super和this关键字是引用某个对象的引用变量。换句话说,它属于类的实例。如果您正在寻找替代方法而不是A::Func,您可以这样做class B extends A {static int Func(int y) {&nbsp; &nbsp; // return (int) (Math.random() * y);&nbsp; &nbsp; return y + 1;}public int getSuperFunc(int y){&nbsp; &nbsp; //call A class Func(int y)&nbsp; &nbsp; return super.Func(y);}}并在测试类的主要方法中System.out.print("Enter a number: ");java.util.Scanner scanner = new java.util.Scanner(System.in);//int result = funcOp(B::Func, scanner.nextInt()); // <-This works.B b=new B();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;int result1 = funcOp(b::getSuperFunc, scanner.nextInt()); // <-This works.scanner.close();System.out.println(result1);输出Enter a number: 11
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java