2012-06-14 30 views
4

两个目录中的同一个源文件

我想在Java类中引用Errors.scala中的以下密封特征。在Scala 2.9.1中,我能够从Java中引用Errors.TooBig作为错误$ TooBig $,它不再在2.9.2中编译。密封特质/对象案例类别字节代码从2.9.1更改。到2.9.2?

Errors.scala

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一个DIFF:

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 

你可以看到,有显然是一个被称为“类错误$ TooBig $ '由2.9.1和2.9.2生成。

回答

2

您不应该依赖类名从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();