有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

鉴于以下代码:

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

编译器突然没有给出错误

简单地说。如果我试图对实例方法中声明的本地类使用构造函数引用,编译器会抱怨无法访问构造函数,对此我感到困惑

如果有人能解释为什么会发生这种情况,我们将不胜感激。 谢谢


共 (2) 个答案

  1. # 1 楼答案

    一个问题是,您试图通过在列表中指定泛型类型来实例化Arraylist,但没有在Arraylist中使用相同的类型

    使用: List ls=new ArrayList()

    另外,请提供LocalFoo的默认构造函数

  2. # 2 楼答案

    看起来LocalFoo以某种方式被视为一个非静态类。这就是为什么它声称范围内没有测试实例

    从教程中:

    Local classes are non-static because they have access to instance members of the enclosing block. Consequently, they cannot contain most kinds of static declarations.

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

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

    应该有一种方法可以直接说^{,但那是行不通的。如果是这样,编译器也应该只接受LocalFoo::new

    现在有一个错误报告:https://bugs.openjdk.java.net/browse/JDK-8144673
    (见comment by Brian Goetz