Статические методы в интерфейсе требуют -target:jvm-1.8
Я строю проект Scala с использованием Gradle 4.5, Scala 2.11.11/2.12.4 с JDK 1.8.0_162, и он работал нормально, пока я не обновлюсь до Scala 2.11.12. С 2.11.12 я получаю ошибку компиляции
Static methods in interface require -target:jvm-1.8
Я пытался найти в Google и добавить пару вещей, таких как
ScalaCompileOptions.metaClass.useAnt = false
Или же
targetCompatibility="1.8"
но никто из них не решает проблему.
1 ответ
Хорошо, после нескольких недель борьбы с этой проблемой и решения о публикации на SO, я пытаюсь еще больше поиграть с gradle, мне наконец-то удалось решить эту проблему.
Оказывается, я должен добавить эти две строки в Gradle
project.tasks.compileScala.scalaCompileOptions.additionalParameters = ["-target: jvm-1.8"] project.tasks.compileTestScala.scalaCompileOptions.additionalParameters = ["-target: jvm-1.8"]
Это устраняет проблему и не возвращается.
Дополнение к ответу @Wins для тех, кто использует maven с scala-maven-plugin
. Вам необходимо добавить следующую строку в конфигурацию плагина:
<addScalacArgs>-target:jvm-1.8</addScalacArgs>
"Статические методы в интерфейсе требуют -target:jvm-1.8"
Эта ошибка компиляции четко указывает, что статический метод интерфейса вызывается и обычно требует целевой JVM версии 1.8, поскольку статические методы доступны в интерфейсах из версии Java 1.8.
Но вызов статического метода интерфейса Java выполняется из Scala согласно формулировке вопроса. Таким образом, вокруг интерфейса Java должен быть scala Wrapper, чтобы инструмент сборки / компилятор мог его понять.
Это работает, если к коду получить доступ следующим образом:
/*************** Java Code ***************/
package a;
import a.A ;
interface NewInterface {
// static method
static String sayHello(String name)
{
<Statement ....> // calls other Java Class methods => say A.x(); [Assume, class A is from package 'a' and x,y,z are some static methods]
<Statement ....> // calls other Java Class methods => say A.y();
<Statement ....> // calls other Java Class methods => say A.z();
return "Hello, "+name ;
}
}
/*************** Scala Wrapper ***************/
// Scala Wrapper for Java's Interface
package b
import a.A // importing the Java class A
trait NewTrait {
def sayHello(name: String): String = {
<Statement ....> A.x() // make code in scala to replicate same functionality of the static method
<Statement ....> A.y() // by using Java Classes.
<Statement ....> A.z()
"Hello, "+name
}
}
/*************** Scala call on Static methods of Interface ***************/
// Scala Object calls Wrapper instead of Java Interface
package b
import b.NewTrait
object NewObject extends App with NewTrait { // Wrapper has to be extended instead of calling a java's Interface static method directly.
sayHello("James") // Resolved: "Static methods in interface require -target:jvm-1.8"
}