Ari*_*han 5 java ant scala cyclic-reference
目前,我有一个使用 Ant 构建的现有 Java 项目,我正在尝试将其设置为使用混合源(Java 和 Scala)进行构建。
\n\n我有一个 Java 接口定义为 -public interface One<T extends Two<? super T>>
当我从 Ant 构建运行 scalac 时,出现以下错误:
\n\n错误:涉及类型 T 的非法循环引用。
\n\n由于我希望 Scala 和 Java 类在我的项目中相互依赖,因此我首先运行 scalac 任务,然后在 Ant 构建中运行 javac。我的 scalac 块如下所示:
\n\n<scalac srcdir="${src.path}" destdir="${build.classes}" encoding="UTF-8" >\n <classpath refid="compile.classpath" />\n <include name="**/*.scala"/>\n <include name="**/*.java"/>\n</scalac> \nRun Code Online (Sandbox Code Playgroud)\n\n有什么办法解决这个问题吗?我无法修改 Java 代码,因为还有大量其他代码使用它。
\n\n我正在使用 Java 7 和 Scala 2.11.5
\n\nHere\xe2\x80\x99是我最后看到的:
\n\ncom.arif.One.java
\n\npackage com.arif.java;\npublic interface One<T extends One<? super T>> {\n void test1();\n}\nRun Code Online (Sandbox Code Playgroud)\n\ncom.arif.Two.java
\n\npackage com.arif.java;\npublic class Two implements One<Two> {\n @Override\n public void test1() {\n } \n}\nRun Code Online (Sandbox Code Playgroud)\n\ncom.arif.scala.Main.scala
\n\npackage com.arif.scala\nimport com.arif.java.Two\n\nobject Main {\n def main(args:Array[String]) {\n var b:Two = null\n } \n}\nRun Code Online (Sandbox Code Playgroud)\n\n构建.xml
\n\n\n
\n\n<property name="scala.home" value="/Users/arif/software/scala/scala-2.11.5"/>\n<property name="build.classes" value="./build/classes"/>\n\n<property name="src.path" value="src"/>\n<property name="javac.target" value="1.7"/>\n<property name="compile.debug" value="true" />\n<property name="compile.deprecation" value="false" />\n<property name="compile.optimize" value="false" />\n\n<path id="compile.classpath">\n <fileset dir="${scala.home}/lib" includes="*.jar" />\n</path>\n\n<path id="scala.classpath">\n <pathelement location="${scala.home}/lib/scala-compiler.jar" />\n <pathelement location="${scala.home}/lib/scala-library.jar" />\n <pathelement location="${scala.home}/lib/scala-reflect.jar" />\n</path>\n\n<target name="init">\n <taskdef resource="scala/tools/ant/antlib.xml">\n <classpath refid="scala.classpath" />\n </taskdef>\n</target>\n\n<target name="build" description="build" depends="init">\n <scalac srcdir="${src.path}" destdir="${build.classes}" encoding="UTF-8" >\n <classpath refid="compile.classpath" />\n <include name="**/*.scala"/>\n <include name="**/*.java"/>\n </scalac>\n <javac srcdir="${src.path}" destdir="${build.classes}" memoryinitialsize="512m" target="${javac.target}" source="${javac.target}" \n memorymaximumsize="1024m" nowarn="true" debug="${compile.debug}" deprecation="${compile.deprecation}" \n optimize="${compile.optimize}" fork="true" encoding="iso-8859-1" includeantruntime="false">\n <classpath refid="compile.classpath" />\n </javac>\n</target>\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n从项目根目录中的命令行 - 执行“ant build”给出以下内容 -
\n\n[scalac] Compiling 1 scala and 2 java source files to /Users/arif/rbc/scala-java/build/classes\n[scalac] /Users/arif/rbc/scala-java/src/com/arif/java/One.java:3: error: illegal cyclic reference involving type T\n[scalac] public interface One<T extends One<? super T>> {\n[scalac] ^\n[scalac] one error found\nRun Code Online (Sandbox Code Playgroud)\n