我正在尝试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中的错误,我有点错误,我在另一个答案中详细说明了这个错误.
以下 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 与非静态参数生成方法一起工作。
| 归档时间: |
|
| 查看次数: |
16619 次 |
| 最近记录: |