如何将以下Java代码转换为Scala?
class ClassA {
private int field1;
private int field2;
public ClassA() {
field1 = 1;
field2 = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以看到两个选项:
class ClassA(val field1: Int, val field2: Int) {
....
}
Run Code Online (Sandbox Code Playgroud)
要么
class ClassA {
val field1: Int = 1
val field2: Int = 2
}
Run Code Online (Sandbox Code Playgroud)
推荐什么,为什么?
我正在开发一个在运行时生成和编译类的应用程序.这有时会产生大量生成的代码.
在我们的一个测试用例中,我从JVM收到错误:
TestClass.java:83865: too many constants
Run Code Online (Sandbox Code Playgroud)
只是这个.我已经看到有关类似错误的其他报告,但在这些情况下,错误消息抱怨常量池.但在这种情况下它没有.
如果这意味着达到了JVM常量池的限制,那意味着什么?我的意思是,在Java代码方面,这些常量是什么?班级方法?场?文字?我没有静态或最终方法也没有字段.
你能给我一些线索吗?
编辑:
将代码拆分为多个类已经按计划进行.虽然不是出于这个原因.
我意识到恒定池的局限性,我怀疑的正是这个问题.生成的代码不超过10000个方法+字段.
我怀疑的是文字是否也会进入常数池,因为这是我看到将这个数字提高到65K的唯一原因.看来是这样.
我正在使用一个不断从队列中读取的线程.
就像是:
public void run() {
Object obj;
while(true) {
synchronized(objectsQueue) {
if(objectesQueue.isEmpty()) {
try {
objectesQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj = objectesQueue.poll();
}
}
// Do something with the Object obj
}
}
Run Code Online (Sandbox Code Playgroud)
停止此线程的最佳方法是什么?
我看到两个选择:
1 - 由于Thread.stop()不推荐使用,我可以实现一个stopThisThread()使用原子检查条件变量的方法.
2 - 将死亡事件对象或类似内容发送到队列.当线程获取死亡事件时,它将退出.
我更喜欢第一种方式,但是,我不知道何时调用该stopThisThread()方法,因为它可能会出现在队列中,并且停止信号可以首先到达(不可取).
有什么建议?
虽然我已经使用Scala一段时间并且之前已经将它与Java混合,但我碰到了一个问题.
如何将Java数组传递给Scala?我知道反过来相当简单.Java to Scala并非如此.
我应该在Scala中声明我的方法吗?
这是我想要实现的一个小例子:
斯卡拉:
def sumArray(ar: Array[Int]) = ...
Run Code Online (Sandbox Code Playgroud)
Java的:
RandomScalaClassName.sumArray(new int[]{1,2,3});
Run Code Online (Sandbox Code Playgroud)
这可能吗?
简单的问题,但我猜是棘手的答案.
使用通用接口会损害性能吗?
例:
public interface Stuff<T> {
void hello(T var);
}
vs
public interface Stuff {
void hello(Integer var); <---- Integer used just as an example
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是,它没有.泛型只是语言的一部分,编译器会优化它,好像没有泛型(至少在通用接口的这种特殊情况下).
它是否正确?
是否有任何工具可以提供Java动态代码生成并且还支持泛型?
例如,Javassist是我需要的工具,但它不支持泛型.
我写了一个使用Java 6 Compiler API的小型lib,但据我所知它依赖于JDK.有没有办法指定另一个编译器?或者只向我的应用程序提供我需要使用Java Compiler API调用的部分?
我目前正在开发一些Java应用程序的问题.即JVM崩溃了一个段错误.我正在尝试找到hs_err.log文件,该文件应包含有关该问题的一些有用信息.
但是,我找不到这个文件.我用过find,locate等等,什么都没用.
关于为什么没有生成日志文件的任何想法?
我正在使用Gnuplot 4.4,使用Lua支持编译.据说它有tikz终端.
我使用"set terminal tikz"成功地将我的gnuplots编译为tex.但是,将此源添加到我的latex文档时,我不断收到以下错误:
!包pgfkeys错误:我不知道键'/ tikz/gnuplot',我将忽略它.也许你拼错了它.
我在原始tex文档中包含了tikz包.有任何想法吗?
编辑:解决了.见下面的答案.
在我正在进行的项目中,我需要在运行时生成Java类.我稍后在使用这些类时还需要避免使用反射.
我一直在寻找目前的解决方案,并找到了Javassist和Java 6 Java Compiler API.
我很困惑:
Javassist用什么来生成类?它是否使用反射或其他东西?
我编写了一些测试,发现很容易从源代码生成字节码,然后从生成的字节码加载类.使用Javassist相对于此解决方案有什么好处?
正如标题所述,将LinkedHashMap转换为Map是否保留了元素的存储顺序?
我不相信,但找不到任何证据.
或者,Scala中是否存在任何不可变Map的实现,它保留了插入元素的顺序?
我在使用 Guice 注入特定字段实例时遇到了一些问题。
这是我目前拥有的:
class Driver {
private ThreadLocal<Database> db;
...
}
Run Code Online (Sandbox Code Playgroud)
我通常只是在构造函数中传递 db 实例。但是这个类会被拦截,使用guice。
这是模块:
class MyGuiceModule extends AbstractModule {
private ThreadLocal<Database> dbToInject;
public MyGuiceModule(ThreadLocal<Database> dbToInject) {
this.dbToInject = dbToInject;
}
@Override
protected void configure() {
// Binds the interceptor.
bindInterceptor(....);
bind(ThreadLocal.class).toInstance(this.dbToInject);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我实例化所有内容的方式:
Injector injector = new Injector(new MyGuiceModule(db));
Driver driver = injector.getInstance(Driver.class);
Run Code Online (Sandbox Code Playgroud)
我敢打赌这很明显,但我在这里做错了什么?
编辑:
对不起,如果我不清楚。我的问题是这不起作用。未注入实例。我已经用@Inject 注释了该字段,但仍然不起作用。
我有以下场景:
sealed abstract class Type(val inUse: Boolean)
case class IntTy(override val inUse: Boolean) extends Type(inUse)
case class TupleTy(override val inUse: Boolean, elems: Type*) extends Type(inUse) {
def this(elems: Type*) = this(false, elems:_*)
}
Run Code Online (Sandbox Code Playgroud)
在Scala 2.8.0中这很好用,我可以创建一个新的TupleTy实例:
TupleTy(IntTy(false))
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚更新到Scala 2.9.1 final,它不再有效.我现在收到以下错误:
error: type mismatch;
found : IntTy
required: Boolean
TupleTy(IntTy(false))
^
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我错过了某些东西?