当前位置: 首页 > 面试题库 >

Lambda可以访问其目标功能接口的成员吗?

梁丘凯定
2023-03-14
问题内容

我使用java8创建了一个简单的接口。它包含一种方法和一种默认方法。

interface Lambda{

default void dummy(){
    System.out.println("Call this..");
}

void yummy();
}

我正在尝试使用诸如

public class DefaultCheck {

public static void main(String[] args) {

    DefaultCheck check = new DefaultCheck();
    check.activate(new Lambda() {

        @Override
        public void yummy() {
            dummy();
        }
    });

}

void activate(Lambda lambda){
    lambda.yummy();
}

}

现在我正在尝试使用lambda表达式实现相同的功能,得到类似“ dummy is undefined”的错误。

check.activate(() -> {
        dummy();
    });

谁能提出建议,如何使用Lambda表达式实现此方案?


问题答案:

不能做

JLS
15.27.2
解决了这个问题:

与出现在匿名类声明中的代码不同,名称的含义以及出现在lambda主体中的this和super关键字以及引用的声明的可访问性与周围环境相同(除了lambda参数引入新名称)。

在lambda表达式的主体中(无论是隐式的还是隐式的)此透明性(即与周围环境相同)将为实现提供更大的灵活性,并防止主体中不合格名称的含义相互依赖在超载解决方案上。

实际上, lambda表达式需要谈论自己 (以递归 方式调用其 自身 或调用其其他方法是不寻常的
,而使用名称来引用封闭类中的东西则更为常见。否则会被遮盖(这是toString())。
如果有必要让lambda表达式引用自身(如通过此方法),则应改用方法引用或匿名内部类。



 类似资料:
  • 为了丰富运营体验,让开发者更好的体验积分商城功能,兑吧提支持更多的扩展功能 . 支持的扩展功能包含: 1. 游客用户唤醒登录 2. 自有虚拟商品充值 接口说明 充值接口API文档 通知接口API文档 3.加积分接口 接口说明 API文档 4.免登URL自定义参数 dcustom参数 transfer参数 signKeys参数 5. 会员等级功能 6.前置商品查询接口 7. 【秒杀商品】前置查询接口

  • 我目前尝试使用AWS lambda。lambda函数应该从S3 bucket加载zip文件(>10 MB)。S3桶位于中,而lambda函数位于中。 当我尝试保存lambda函数时,我得到: GetObject时出错。S3错误代码:AuthorizationHeaderMalformed。S3错误消息:授权头格式错误;“US-East-1”区域错误;应为“EU-Central-1” 这真的是问题所

  • 问题内容: 关于Java8 内置 功能接口,我遇到了许多问题,包括this,this和this。但是所有人都问“为什么只有一种方法?” 或“如果使用功能接口执行X,为什么会出现编译错误”等。我的问题是: 当我仍然可以在自己的接口中使用lambda时,这些新功能接口的存在目的 是 什么 ? 考虑一下oracle文档中的以下示例代码: 好的,很好,但这可以通过上面自己的示例来实现(带有单个方法的接口已

  • 问题内容: Java 8引入了Lambda表达式和类型注释。 使用类型注释,可以定义Java注释,如下所示: 然后可以在任何类型引用上使用此注释,例如: 这是一个完整的示例,使用此批注打印“ Hello World”: 输出将是: 在Java 8中,还可以用lambda表达式替换此示例中的匿名类: 但是由于编译器会推断lambda表达式的Consumer类型参数,因此不再能够注释创建的Consum

  • 问题内容: 我这样做: 并获得此异常: 不兼容的类型:Intf不是功能接口接口Intf中存在多个非重写的抽象方法。用-Xdiags:verbose重新编译以获得完整的输出1错误 是否有任何条件不能使用lambda替换匿名类? 问题答案: 否。没有办法“克服”这一问题。功能接口必须只有一种抽象方法。您的界面有两个: 注意:您不需要注释中提到的界面注释。但是,如果您的接口不是有效的功能接口,则可以使用

  • 我运行了ARCore SDK和Sceneform SDK中提供所有示例。但在场景样例中,它只检测平面而不检测墙壁。但它可以在ARCore SDK中提供的示例中使用。所以在SceneForm中没有墙检测可用?并且是否有任何ARCore特性是不能使用Sceneform访问的?