Kotlin 无法访问 Java 可以访问的 Java 库的类

Mar*_*c H 5 kotlin

我对 Kotlin 比较陌生,最近开始将一些 Java 项目转换为 Kotlin 进行练习。我知道 Java 代码正在运行,但我在运行 Kotlin 端口时遇到问题。看起来 Kotlin 无法像 Java 那样访问 Java 类。

我在 Java 库中有一个类,如下所示:

package foo.bar.utils;

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

public class Foo {

    private List<Bar> bars;

    public Foo() {
        bars = new ArrayList<>();
    }

    static public class Bar {

        private Qux quxs;

        public Qux getQuxs() {
            return quxs;
        }

        public Bar setQuxs(final Qux quxs) {
            this.quxs = quxs;
            return this;
        }

        static class Qux {

            @Override
            public String toString() {
                return "Qux []";
            }
        }

        static public class QuxClass extends Qux {
            private String id;

            public String getId() {
                return id;
            }

            public QuxClass setId(final String id) {
                this.id = id;
                return this;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

工作的 Java 代码如下所示:

package com.example;

import foo.bar.utils.Foo;

public class JavaMain {

    public static void main(String... args) {
        Foo.Bar bar = new Foo.Bar();
        Foo.Bar.QuxClass qux = new Foo.Bar.QuxClass();
        bar.setQuxs(qux);

        System.out.println(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

非工作的 Kotlin 代码如下所示:

package com.example

import foo.bar.utils.Foo

fun main() {
    val bar = Foo.Bar()
    val qux = Foo.Bar.QuxClass()
    bar.quxs = qux

    println(bar)
}
Run Code Online (Sandbox Code Playgroud)

我省略了(我相信)重现此问题所不需要的代码。

Kotlin 代码实际上可以编译,但在运行时,它会抛出Exception in thread "main" java.lang.IllegalAccessError: tried to access class foo.bar.utils.Foo$Bar$Qux from class com.example.MainKt. 当将鼠标悬停在 上时,IntelliJ 显示bar.quxs一个提示,Type Foo.Bar.Qux! is inaccessible in this context due to: public/*package*/ open class Qux defined in foo.bar.utils.Foo.Bar但我很难理解该提示。

一个可能的修复方法是将内部类 Qux 的可访问性更改为 public。

我尝试了 OpenJDK 12 和 Amazon Corretto 8,结果相同。

我还尝试检查 Kotlin 和 Java 代码的反编译代码,但没有发现任何值得注意的差异。

调用 setQuxs() 也没有帮助。

有没有办法改变我的 Kotlin 代码来让端口运行?我真的很想了解 Kotlin 为什么会这样。

小智 0

New 关键字不适用于在 Kotlin 中创建对象,您可以像这样添加导入

import foo.bar.utils.Foo.Bar
import foo.bar.utils.Foo.Bar.QuxClass
Run Code Online (Sandbox Code Playgroud)

然后创建像这样的对象

    val bar = Bar()
    val qux = QuxClass()
Run Code Online (Sandbox Code Playgroud)

  • 当问题的 Kotlin 代码中没有包含“new”时,为什么要提到“new”呢?(仅在需要的 Java 代码中。)为什么限定名称不能与“导入”名称一样有效? (3认同)