当前位置: 首页 > 知识库问答 >
问题:

是否可以在lambda正文或匿名类中使用不有效的最终或最终变量?

米子轩
2023-03-14

是否有可能在lamba体中使用既不是有效的最终变量,也不是最终的变量?
那么有没有办法让下面的代码编译呢?

class Main {
    interface Test{
        String method();
    }
    void w(){
        String str = "foo";
        str = "bar";
        Test t = () -> str;
    }
}

共有1个答案

丁宏盛
2023-03-14

是的,有可能。< br >您可以将您的值有效地复制到最终局部变量:

class Main {
    interface Test{
        String method();
    }
    void w(){
        String str = "foo";
        str = "bar";
        String tmpStr = str;
        Test t = () -> tmpStr;
    }
}

从现在开始,您的临时值实际上是最终值,您可以在lambda表达式或匿名类中使用它。

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin

  • 我在这里读了一些关于创建不可变对象的书,我想知道,我有以下类: 这是Oracle建议创建不可变类的方式,但是,在C#中,你可以声明你的setter私有,Java如果我这样做,它仍然是不可变的吗? 实现私有setter而不是使私有变量为final并使用构造函数有什么错?

  • 在此代码示例中,ActionListener的actionPerformed函数中没有使用最终对象jLabel:

  • 在可能的副本上: 此线程不是在询问如何扩展类。它问为什么一个声明为的类可能会扩展另一个类。 从该线程: <code>final</code>类只是一个不能扩展的类。 但是,我有一个帮助程序类,我声明它是,并了另一个类: Eclipse没有检测到任何错误。我已经测试了这个类,并且PDF是成功生成的,没有错误。 为什么我能够课程,而理论上我不应该延长? (如果重要的话,我正在使用Java7。)

  • 问题内容: 在通过构造函数传递给匿名类的最终变量中,Jon Skeet提到了变量是通过自动生成的构造函数传递给匿名类实例的。在这种情况下,为什么我看不到使用反射的构造函数: } 输出为: 问题答案: 这是您的程序在我的系统上输出的内容: 因此,构造函数在那里。但是,它是无参数的。从反汇编来看,发生的事情是编译器发现它不需要传递给它,因为它的值在编译时就知道了。 如果我这样更改代码: 现在生成的构造

  • 在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?