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

使用本地类时构造函数引用无效?

蔚楷
2023-03-14
问题内容

给出以下代码:

package com.gmail.oksandum.test;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
    }

    public void foo() {
        class LocalFoo {

            LocalFoo(String in) {
                //Some logic
            }

        }

        List<String> ls = new ArrayList<>();
        ls.stream().map(LocalFoo::new); //Line 21
    }

}

我的IDE没有给我任何错误。也就是说,直到我尝试构建项目并运行它。当我这样做时,它给了我一个看起来像这样的编译器错误:

Error:(21, 24) java: incompatible types: cannot infer type-variable(s) R
    (argument mismatch; invalid constructor reference
      cannot access constructor LocalFoo(java.lang.String)
        an enclosing instance of type com.gmail.oksandum.test.Test is not in scope)

现在,我得到了错误消息,如果foo()是静态的,则不会发生这种情况。没错,这仅在foo()是实例方法的情况下才会发生。并且仅当LocalFoo是实例方法中的本地类时才发生,并且仅当使用构造函数引用时(即从不使用常规方法引用)才发生。

更重要的是,如果我将第21行更改为

ls.stream().map(str -> new LocalFoo(str));

编译器突然没有给出错误。

因此,回顾一下。如果我尝试在实例方法中声明的本地类上使用构造函数引用,则编译器会抱怨无法访问构造函数,对此我感到困惑。

如果有人可以阐明为什么会发生这种情况,将不胜感激。谢谢。


问题答案:

看起来好像LocalFoo以某种方式被视为非静态类。这就是为什么它声称没有Test实例在范围内的原因。

从教程中:

局部类是非静态的,因为它们可以访问封闭块的实例成员。因此,它们不能包含大多数静态声明。

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

该方法foo()或类LocalFoo必须是静态的才能起作用。但是方法内的类不能声明为静态。因此,如果foo()应该保持非静态(作为内部静态类),则必须将其移出方法。另一种选择是仅使用此:
ls.stream().map(s -> new LocalFoo(s));

应该有一种只说的方法Test.this.LocalFoo,但这是行不通的。如果这样做,编译器也应该接受LocalFoo::new



 类似资料:
  • 问题内容: 这是我无法完成的考试问题。 如何通过仅在MyClass构造函数中编辑代码来获取以下Java代码以打印false? 不允许您覆盖equals方法或更改main方法中的任何代码。该代码必须在程序不崩溃的情况下运行。 根据我的研究,实例化类时不能将Java对象引用设置为null。所以我正式陷入了困境。 问题答案: 太难了! 或Paul Boddington的简化版本: 或是AJ Neufel

  • 这是一道我无法完成的试题。 如何仅通过编辑MyClass构造函数中的代码来让下面的java代码打印false? 不允许重写equals方法,也不允许更改main方法中的任何代码。代码必须在程序不崩溃的情况下运行。 根据我的研究,在实例化类时,不能将Java对象引用设置为null。所以我正式被难倒了。

  • 我用java编写了这个简单的类只是为了测试它的一些特性。 输出为: 2. 但在此代码中: 这段代码的输出是: 0 那么,当我在构造函数方法声明中使用void时,类的静态字段为什么不再改变?

  • 问题内容: 我有一个类A,并写了一个子类B。A只有一个参数化的构造函数。B必须调用A的这个超级构造函数。现在,我想使用一个Object作为参数。该对象应调用B的方法。因此,参数对象必须持有B的引用,或者必须是内部类。 现在,当我想调用构造函数时,……Eclipse说: 在显式调用构造函数时无法引用“ this”或“ super” 我唯一想解决的是设置方法,将“ this”实例注入到参数对象中。我不

  • 鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数