2012-03-25 62 views
3

我有一个Scala/Java双语言项目,我需要从Java传递Scala枚举。如何通过Java中的Scala枚举

object MonthSelection extends Enumeration { 
    type MonthSelection = Value 

    val LastMonth, ThisMonth, NextMonth, CustomMonth = Value 
} 

class MyClass { 

    def doDateStuff(monthChosen: MonthSelection) = { 
    // do stuff 
    } 
} 

如何从Java调用此函数?我得到一个编译错误,因为我似乎无法导入scala.Enumeration.Value。

MyClass myClass = new MyClass(); 
    myClass.doStuff(MonthSelection.ThisMonth); 

回答

5

如果有疑问,请查看生成的字节码。 :)

$> cat foo.scala 
object MonthSelection extends Enumeration { 
    type MonthSelection = Value 

    val LastMonth, ThisMonth, NextMonth, CustomMonth = Value 
} 

$> scalac -d bin foo.scala 
$> ls bin 
MonthSelection$.class MonthSelection.class 
$> javap bin/MonthSelection 
Compiled from "foo.scala" 
public final class MonthSelection extends java.lang.Object{ 
    public static final scala.Enumeration$Value CustomMonth(); 
    public static final scala.Enumeration$Value NextMonth(); 
    public static final scala.Enumeration$Value ThisMonth(); 
    public static final scala.Enumeration$Value LastMonth(); 
    public static final scala.Enumeration$ValueSet$ ValueSet(); 
    public static final scala.Enumeration$Value withName(java.lang.String); 
    public static final scala.Enumeration$Value apply(int); 
    public static final int maxId(); 
    public static final scala.Enumeration$ValueSet values(); 
    public static final java.lang.String toString(); 
} 

好的,简单。所有这些枚举都是公共静态方法。我只需要导入scala.Enumeration并直接调用这些方法。

$> cat Some.java 
import scala.Enumeration; 

public class Some { 
    public static void main(String args[]) { 
     System.out.println("Hello!"); 
     System.out.println(MonthSelection.CustomMonth()); 
    } 
} 

$> javac -cp $SCALA_HOME/lib/scala-library.jar:bin/ -d bin Some.java 
$> ls bin 
MonthSelection$.class MonthSelection.class Some.class 
$> java -cp $SCALA_HOME/lib/scala-library.jar:bin Some    
Hello! 
CustomMonth 

希望这可以给你更多的想法。 :)