Статические методы в интерфейсе требуют -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"
}
Другие вопросы по тегам