我目前正在使用 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 record
下 main/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.javapublic record TestJavaRecord(int i) {}
main/jvm/TestScalaClass.scalaclass TestScalaClass(val i: Int, val testJavaRecord: TestJavaRecord) {}
main/jvm/TestJavaClass.javapublic class TestJavaClass {
public int i;
public TestScalaClass testScalaClass;
public TestJavaClass(int i, TestScalaClass testScalaClass) {
this.i = i;
this.testScalaClass = testScalaClass;
}
}
main/jvm/ScalaMain.scalaobject 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.javapublic 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/