java - 我如何用scala代码编译java记录?

标签 java scala gradle

我目前正在使用 Scala 和 Java 进行项目。我们想在 Java 上重写一些 Scala 代码。所以当我开始重写我的代码时,我遇到了这个问题。

CountryResponse.java:5: illegal start of type declaration
Scala 似乎无法编译 JDK 16 中引入的 Java 记录。我做了一些研究,发现只有 this discussion在 GitHub 上。有人可以建议任何解决方法来编译 Java 的记录吗?
我确实尝试将 Scala 版本从 2.12.2 增加到 2.13.6,但问题没有解决。
我们使用 Java 16、Scala 2.12.2 和 Gradle 7.0.1 以及 Gradle 的 Scala 和 java 插件。
同样在这里我的 gradle 设置用于编译两个源。
compileScala {
    sourceCompatibility("16")
    targetCompatibility("16")
}

sourceSets {
    main {
        java {
            srcDirs = []
        }
        scala {
            srcDirs = ['src/main/scala', 'src/main/java']
        }
    }
}
编辑:更新讨论链接

最佳答案

我使用以下包含 Scala 和 Java 16 源代码的项目进行了测试。 Scala 和 Java 源代码相互依赖。
如果您的 Java 和 Scala 源相互依赖,那么您需要将这些源放在 common 文件夹下。让我们说 main/jvm .
您可以放置​​所有 Java recordmain/java .只要您的 record 就可以使用s 不依赖于 Scala 代码。否则,您将不得不将其分解为多个模块并根据依赖关系图进行微观管理。
Gradle 版本是 7.1,这个项目构建成功,然后运行成功(ScalaMain 和 JavaMain)。
构建.gradle

plugins {
    id 'java'
    id 'scala'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

compileScala {
    sourceCompatibility("16")
    targetCompatibility("16")
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
        scala {
            srcDirs = ['src/main/jvm']
        }
    }
}

dependencies {
    implementation 'org.scala-lang:scala-library:2.13.6'
}
主/java/TestJavaRecord.java
public record TestJavaRecord(int i) {}
main/jvm/TestScalaClass.scala
class TestScalaClass(val i: Int, val testJavaRecord: TestJavaRecord) {}
main/jvm/TestJavaClass.java
public class TestJavaClass {
    public int i;
    public TestScalaClass testScalaClass;

    public TestJavaClass(int i, TestScalaClass testScalaClass) {
        this.i = i;
        this.testScalaClass = testScalaClass;
    }
}

main/jvm/ScalaMain.scala
object ScalaMain extends App {

  val testJavaRecord = new TestJavaRecord(5)

  val testScalaClass = new TestScalaClass(5, testJavaRecord)

  val testJavaClass = new TestJavaClass(5, testScalaClass)

  println(testJavaRecord.i)

  println(testScalaClass.testJavaRecord.i)

  println(testJavaClass.testScalaClass.testJavaRecord.i)

}
主/JVM/JavaMain.java
public class JavaMain {

    public static void main(String[] args) {
        TestJavaRecord testJavaRecord = new TestJavaRecord(5);

        TestScalaClass testScalaClass = new TestScalaClass(5, testJavaRecord);

        TestJavaClass testJavaClass = new TestJavaClass(5, testScalaClass);

        System.out.println(testJavaRecord.i());

        System.out.println(testScalaClass.testJavaRecord().i());

        System.out.println(testJavaClass.testScalaClass.testJavaRecord().i());
    }
}

关于java - 我如何用scala代码编译java记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68684794/

相关文章:

java - 字符串标记化以删除一些数据

java - 简单的java if-else编译错误

scala - 在 Scala 中,每个 "setter"方法都需要一个 "getter"方法?

java - 要获取的 SQL,如果不存在则插入新条目

java - 为什么我们可以调用接口(interface)org.w3c.dom.Document的方法?

scala - 为什么 Scala 中声明的非法开始?

scala - 如何在scala的foreach中执行操作?

java - IntelliJ 15 Android 开发错误 : The supplied javaHome seems to be invalid.

gradle - 禁用所有期望编译项目的传递依赖项(…)

android - Gradle 同步失败 : Could not find any matches for com. android.tools.build :gradle:1. 0.+ 因为没有可用的 com.android.tools.build:gradle 版本