Scala:班级中的公共静态决赛

ren*_*fis 9 java scala

我正在尝试public static final使用TwiP在Scala中获得Java的真正等价物.

val在a 中创建一个object对我不起作用,因为它是新生成的类的一部分,Example$.class而TwiP无法从类中访问它Example.class.

这是我尝试移植到Scala的Java类的示例:

public static final String[] MY_STRINGS = { "A", "B", "C" };

@Test
public void myTest(@Values("MY_STRINGS") String string) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何移植public static final到Scala.如果它是像这里的对象中的val

@RunWith(classOf[TwiP])
class Foo {

  import Foo.MY_STRINGS

  @Test
  def testTwiP(@Values("MY_STRINGS") value: String): Unit = {
    println("I'm testing value " + value + ".")
  }

}

object Foo {
  val MY_STRINGS = Array("A", "B", "C")
}
Run Code Online (Sandbox Code Playgroud)

我只得到以下异常:

net.sf.twip.internal.TwipConfigurationError:
there is no method or field 'MY_STRINGS' named in the @Values annotation of Parameter#1
Run Code Online (Sandbox Code Playgroud)

如何使用Scala解决问题?

Ken*_*oom 11

object Foo{
  val MY_STRINGS=Array("A","B","C")
}
class Foo{
  import Foo.MY_STRINGS
}
Run Code Online (Sandbox Code Playgroud)

val伴随对象中的定义创建了您的public static final变量,并且import声明在您用于编写类的代码中为它提供了一个很好的简单别名.

请注意,public static final如果从Java调用此代码,Scala 中的变量仍将编译为看起来像静态方法调用.

编辑:由于Scala 2.7中的错误,我有点错误,我在另一个答案中详细说明了这个错误.


Ken*_*oom 6

以下 Scala 代码:

class Foo{
  import Bar.MY_STRINGS
}
object Bar{
  val MY_STRINGS=Array("A","B","C")
}
Run Code Online (Sandbox Code Playgroud)

生成以下 Java 类:

public final class Bar extends java.lang.Object{
    public static final java.lang.String[] MY_STRINGS();
    public static final int $tag()       throws java.rmi.RemoteException;
}
public final class Bar$ extends java.lang.Object implements scala.ScalaObject{
    public static final Bar$ MODULE$;
    public static {};
    public Bar$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}
public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}
Run Code Online (Sandbox Code Playgroud)

以下 Scala 代码:

class Foo{
  import Foo.MY_STRINGS
}
object Foo{
  val MY_STRINGS=Array("A","B","C")
}
Run Code Online (Sandbox Code Playgroud)

生成以下 Java 类:

public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}
public final class Foo$ extends java.lang.Object implements scala.ScalaObject{
    public static final Foo$ MODULE$;
    public static {};
    public Foo$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}
Run Code Online (Sandbox Code Playgroud)

当对象与类同名时,静态成员未在类上定义的事实是Scala Bug #1735,它在 Scala 2.8 快照中得到修复。

所以看起来 TwiP 根本无法工作,除非您升级 Scala,或者找到一种方法让 TwiP 与非静态参数生成方法一起工作。