Scala MutableList和ListBuffer类之间有什么区别scala.collection.mutable?你什么时候使用一个与另一个?
我的用例是一个线性序列,我可以有效地删除第一个元素,prepend和append.什么是最好的结构?
在Scala中是否有一种方法可以在我的代码中找到并显示implicits的所有用法,或者在没有启用implicits的情况下进行编译(因此我遇到了编译错误)?我希望找到我无意中在内循环中分配额外内存的地方.
我正在编写一个Scala类来继承Java类,我必须覆盖一个将受保护的Java内部类作为参数的方法.Java依赖是一个没有源代码的jar.
我有与https://issues.scala-lang.org/browse/SI-3120中完全相同的设置,除了我没有可用的Java源代码,因此scalac只通过查看它来了解Java依赖关系字节代码(在jar或类文件中).
这基本上就是我要做的事情:
// javapkg/JavaSuperClass.java
package javapkg;
public class JavaSuperClass {
protected class JavaInnerClass {
}
public void method(JavaInnerClass javaInnerclass) {
System.out.println("hello");
}
}
// scalapkg/ScalaSubClass.scala
package scalapkg
import javapkg.JavaSuperClass
class ScalaSubClass extends JavaSuperClass {
override def method(javaInnerClass: JavaSuperClass#JavaInnerClass) {
println("world")
}
}
Run Code Online (Sandbox Code Playgroud)
我在Linux上有Java Sun JDK Hotspot 1.6.0_24和Scala 2.9.0.1.这是发生的事情:
$ cd javapkg
$ javac JavaSuperClass.java
$ cd ../scalapkg
$ scalac -cp .. ScalaSubClass.scala
ScalaSubClass.scala:6: error: class JavaInnerClass in class JavaSuperClass cannot be accessed in javapkg.JavaSuperClass
Access to protected …Run Code Online (Sandbox Code Playgroud) 我想在我的Scala代码中使用基本类型安全的"子类",而不会出现拳击的性能损失(对于非常低延迟的应用程序).例如,像这样:
class Timestamp extends Long
class ProductId extends Long
def process(timestamp: Timestamp, productId: ProductId) {
...
}
val timestamp = 1: Timestamp // should not box
val productId = 1: ProductId // should not box
process(timestamp, productId) // should compile
process(productId, timestamp) // should NOT compile
Run Code Online (Sandbox Code Playgroud)
去年Scala用户邮件列表上有一个帖子似乎得出结论,没有拳击是不可能的,但我想知道现在Scala 2.8是否可行.
在java 6中,我能够在Scala中使用JNI就好了.我会有像这样的代码:
package mypackage
object MyClass {
System.loadLibrary("myclass-native")
@native def foo(): Int = sys.error("")
}
Run Code Online (Sandbox Code Playgroud)
然后我跑了:
javah -classpath target/scala-2.9.1/classes -d target/jni mypackage.MyClass$
Run Code Online (Sandbox Code Playgroud)
而且我的头文件也很好.
在java 7中,我收到以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: mypackage.MyClass.
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:177)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:68)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:509)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:335)
at com.sun.tools.javah.Main.main(Main.java:46)
Run Code Online (Sandbox Code Playgroud)
这就像javah不再接受类名中的美元符号,但我需要在Scala中使用美元符号来获得静态方法的等价物.
供java 6参考:
$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)
$ javah -version
javah version "1.6.0_29"
Run Code Online (Sandbox Code Playgroud)
用java 7:
$ java …Run Code Online (Sandbox Code Playgroud) 我正在将一些代码从2.9.1更新到2.10.0(我尝试使用相同结果的2.10.1),在两种情况下都使用SBT 0.12.1.
当我sbt clean compile在命令行上运行时,它们都在大约250秒后完成.
然而,当我运行sbt交互,并重复输入clean,然后compile,我的2.9编译变得更快,但我的2.10编译得到慢10倍.
如果我使用768m的堆大小,则在第3次编译时2.10内存不足.堆大小为4g时,每次都可以编译,但在第一次迭代后总是慢10倍.
[success] Total time: 258 s, completed Mar 14, 2013 10:44:34 AM
[success] Total time: 2048 s, completed Mar 14, 2013 11:23:03 AM
[success] Total time: 2049 s, completed Mar 14, 2013 11:58:42 AM
[success] Total time: 2047 s, completed Mar 14, 2013 12:43:19 PM
Run Code Online (Sandbox Code Playgroud)
我调试以找出发生了什么的最佳方式是什么?
我有一些使用存在类型的Scala代码,我正在升级到2.10,我注意到有关添加"import language.existentials"的警告,这让我觉得应该有更好的方法来编写它.我的代码归结为:
class A {
private var values = Set.empty[(Class[_], String)]
def add(klass: Class[_], id: String) {
val key = (klass, id)
if (!values(key)) {
values += key
// More logic below..
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这个警告:
[warn] test.scala:4 inferred existential type (Class[_$2], String) forSome { type _$2 }, which cannot be expressed by wildcards, should be enabled
[warn] by making the implicit value language.existentials visible.
[warn] This can be achieved by adding the import clause 'import language.existentials'
[warn] or by setting …Run Code Online (Sandbox Code Playgroud)