Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 密封特征/对象案例类字节码已从2.9.1更改。到2.9.2? 两个目录中的源文件相同_Scala_Scala 2.9_Scala Java Interop - Fatal编程技术网

Scala 密封特征/对象案例类字节码已从2.9.1更改。到2.9.2? 两个目录中的源文件相同

Scala 密封特征/对象案例类字节码已从2.9.1更改。到2.9.2? 两个目录中的源文件相同,scala,scala-2.9,scala-java-interop,Scala,Scala 2.9,Scala Java Interop,我想在Java类中引用Errors.scala中的以下密封特性。在Scala 2.9.1中,我能够将Java中的Errors.TooBig引用为Errors$TooBig$,在2.9.2中不再编译 斯卡拉酒店 package com.abc sealed trait Error object Errors { case object TooBig extends Error } JavaTest.java import com.abc.Errors$TooBig$; public cl

我想在Java类中引用Errors.scala中的以下密封特性。在Scala 2.9.1中,我能够将Java中的Errors.TooBig引用为Errors$TooBig$,在2.9.2中不再编译

斯卡拉酒店

package com.abc

sealed trait Error

object Errors {
  case object TooBig extends Error
}
JavaTest.java

import com.abc.Errors$TooBig$;
public class JavaTest {
}
我在两个不同的目录(2.9.1/2.9.2)中有相同的源文件。我可以使用2.9.1编译源代码,但不能使用2.9.2

>2.9.1$ brew switch scala 2.9.1
>2.9.1$ scalac Errors.scala
>2.9.1$ javac -classpath .:/usr/local/Cellar/scala/2.9.1/libexec/lib/scala-library.jar JavaTest.java
>2.9.1$
>2.9.1$ cd ../2.9.2
>2.9.2$ brew switch scala 2.9.2
>2.9.2$ scalac Errors.scala
>2.9.2$ javac -classpath .:/usr/local/Cellar/scala/2.9.2/libexec/lib/scala-library.jar JavaTest.java
JavaTest.java:1: cannot find symbol
symbol  : class Errors$TooBig$
location: package com.abc
import com.abc.Errors$TooBig$;
              ^
1 error
}
}
下面是com.abc.Errors$TooBig$类文件的javap转储的区别:

mhughes:~/scalatest$ diff 2.9.1/TooBig.txt 2.9.2/TooBig.txt 
2c2
< public final class com.abc.Errors$TooBig$ extends java.lang.Object implements com.abc.Error,scala.ScalaObject,scala.Product,scala.Serializable
---
> public final class com.abc.Errors$TooBig$ extends java.lang.Object implements com.abc.Error,scala.Product,scala.Serializable
5a6,7
>   InnerClass: 
>    public final #68= #9 of #67; //TooBig$=class com/abc/Errors$TooBig$ of class com/abc/Errors
73,80c75,84
< const #65 = Asciz com/abc/Error;
< const #66 = class #65;    //  com/abc/Error
< const #67 = Asciz scala/ScalaObject;
< const #68 = class #67;    //  scala/ScalaObject
< const #69 = Asciz scala/Product;
< const #70 = class #69;    //  scala/Product
< const #71 = Asciz scala/Serializable;
< const #72 = class #71;    //  scala/Serializable
---
> const #65 = Asciz InnerClasses;
> const #66 = Asciz com/abc/Errors;
> const #67 = class #66;    //  com/abc/Errors
> const #68 = Asciz TooBig$;
> const #69 = Asciz com/abc/Error;
> const #70 = class #69;    //  com/abc/Error
> const #71 = Asciz scala/Product;
> const #72 = class #71;    //  scala/Product
> const #73 = Asciz scala/Serializable;
> const #74 = class #73;    //  scala/Serializable
mhughes:~/scalatest$diff 2.9.1/TooBig.txt 2.9.2/TooBig.txt
2c2
公共最终类com.abc.Errors$TooBig$extends java.lang.Object实现com.abc.Error、scala.Product、scala.Serializable
5a6,7
>内部类:
>公开决赛#68=#67中的#9//TooBig$=类别com/abc/Errors$TooBig$类别com/abc/Errors
73,80c75,84
const#65=Asciz内部类;
>const#66=Asciz com/abc/Errors;
>常数#67=等级#66;//com/abc/Errors
>const#68=Asciz TooBig$;
>const#69=Asciz com/abc/Error;
>常数#70=等级#69;//com/abc/Error
>const#71=Asciz scala/产品;
>常数#72=类#71;//scala/产品
>const#73=Asciz scala/Serializable;
>常数#74=类#73;//scala/可序列化

您可以清楚地看到,2.9.1和2.9.2都生成了一个名为“Errors$TooBig$”的类

从Java检索scala对象时不应依赖类名。您可以编写一个设计用于从Java调用的静态工厂:

package com.abc

sealed trait Error

object Errors {
  case object TooBig extends Error

  //Java API
  def getTooBig(): Error = TooBig
}
然后,使用以下命令从Java调用它:

import com.abc.*;

Error tooBig = Errors.getTooBig();