接口中的静态方法需要-target:jvm-1.8

时间:2018-03-10 20:19:19

标签: scala gradle

我正在使用gradle 4.5,scala 2.11.11 / 2.12.4和JDK 1.8.0_162构建scala项目,并且它工作正常,直到我升级到scala 2.11.12。随着2.11.12我不断收到编译错误

ScalaCompileOptions.metaClass.useAnt = false

我一直在尝试在谷歌搜索并添加一些像

这样的东西
targetCompatibility="1.8"

或者

static int index=var;

但他们都没有解决问题。

3 个答案:

答案 0 :(得分:3)

好的,经过几个星期的努力解决这个问题并决定发布SO之后,我尝试用gradle进一步调整,我终于设法解决了这个问题。

原来我必须将这两行添加到gradle

  

project.tasks.compileScala.scalaCompileOptions.additionalParameters = [" -target:jvm-1.8"]   project.tasks.compileTestScala.scalaCompileOptions.additionalParameters = [" -target:jvm-1.8"]

这是解决问题的方法,它不会回来。

答案 1 :(得分:2)

对于使用scala-maven-plugin的maven的用户,@ Wins答案的补充。您需要在插件配置中添加以下行:

<addScalacArgs>-target:jvm-1.8</addScalacArgs>

答案 2 :(得分:1)

“接口中的静态方法需要-target:jvm-1.8”

此编译错误明确指出,正在调用Interface的静态方法,并且由于Java 1.8版的Interfaces中提供了静态方法,因此通常需要Target JVM 1.8版。

但是,根据问题语句,从Scala完成对Java Interface静态方法的调用调用。因此,需要Java界面周围的scala包装器,以便构建工具/编译器可以理解它。

如果以这种方式访问​​代码,它将起作用:

/*************** 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"
}