为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2021-12-18 09:56:42
我正在学习 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”。这是不对的,我是否以错误的方式获得了方法引用?
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

从JLS:


形式 super.Identifier 指的是当前对象名为 Identifier 的字段,但将当前对象视为当前类的超类的实例。


[...]


使用关键字 super的形式仅在类的实例方法、实例初始值设定项或构造函数中,或在类的实例变量的初始值设定项中有效。如果它们出现在其他任何地方,则会发生编译时错误。


您正在super从类类型调用,因此编译错误。


正如许多人在评论中建议的那样,您应该只传递A::Func该funcOp方法。


请注意,您也无法super从您的Func方法调用,因为它是一个static方法,因此它不绑定到类实例。


编辑以下 OP 的评论


您可以使用super实例方法中的关键字(因此,如果您删除静态),它看起来像这样:


class B extends A {

    int Func(int y) {

        // e.g:

        if (y > 10) {

            return super.Func(y); // call Func from the parent class

        }

        return y + 1;

    }

}


查看完整回答
反对 回复 2021-12-18
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

super和this关键字是引用某个对象的引用变量。换句话说,它属于类的实例。


如果您正在寻找替代方法而不是A::Func,您可以这样做


class B extends A {


static int Func(int y) {

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

    return y + 1;

}


public int getSuperFunc(int y)

{

    //call A class Func(int y)

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

int result1 = funcOp(b::getSuperFunc, scanner.nextInt()); // <-This works.


scanner.close();

System.out.println(result1);

输出


Enter a number: 1

1


查看完整回答
反对 回复 2021-12-18
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信