Scala提供了一个生成Java varargs转发器方法的@varargs注释,可以编写如下内容:
import scala.annotation.varargs
class Foo {
@varargs def foo(args: String*): Unit = {
args.foreach(println)
}
}
Run Code Online (Sandbox Code Playgroud)
然后从Java调用此方法而无需创建scala.Seq:
Foo foo = new Foo();
foo.foo("a", "b");
Run Code Online (Sandbox Code Playgroud)
这很不错.
不幸的是,当方法是抽象的时,似乎没有发生转发部分:
trait Bar {
@varargs def bar(args: String*): Unit
}
class Baz extends Bar {
def bar(args: String*): Unit = {
args.foreach(println)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们有这个Java代码:
Bar bar = new Baz();
bar.bar("a", "b");
Run Code Online (Sandbox Code Playgroud)
我们得到这个异常(在运行时):
java.lang.AbstractMethodError: Baz.bar([Ljava/lang/String;)V
Run Code Online (Sandbox Code Playgroud)
我们可以用以下方法确认问题javap:
public interface Bar {
public abstract void bar(java.lang.String...);
public abstract void …Run Code Online (Sandbox Code Playgroud) 我试图使用java Iterators和/或Enumerations将环境变量拉入scala脚本,并意识到Frankenstein博士可能会声称为parentage,所以我从丑陋的树中攻击了以下内容:
import java.util.Map.Entry
import System._
val propSet = getProperties().entrySet().toArray()
val props = (0 until propSet.size).foldLeft(Map[String, String]()){(m, i) =>
val e = propSet(i).asInstanceOf[Entry[String, String]]
m + (e.getKey() -> e.getValue())
}
Run Code Online (Sandbox Code Playgroud)
例如,打印所述相同的环境
props.keySet.toList.sortWith(_ < _).foreach{k =>
println(k+(" " * (30 - k.length))+" = "+props(k))
}
Run Code Online (Sandbox Code Playgroud)
拜托,请不要设置抛光这个t $ #d,只是告诉我scala gem,我确信这种情况存在(即java Properties - > scala.Map),在此先感谢; @)
在Scala中,我们可以写
object Foo { def bar = {} }
Run Code Online (Sandbox Code Playgroud)
这是如何由编译器实现的?我能够Foo.bar();从Java 调用,但是new Foo();从Java中调用错误cannot find symbol symbol: constructor Foo()
注意:这是输出的代码 scalac -print
package <empty> {
final class Foo extends java.lang.Object with ScalaObject {
def bar(): Unit = ();
def this(): object Foo = {
Foo.super.this();
()
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个Java Future对象,我想将其转换为Scala Future.看看jucFuture API,除了isDone方法之外我没有什么可以使用的.这是isDone方法阻止吗?
目前这就是我的想法:
val p = Promise()
if (javaFuture.isDone())
p.success(javaFuture.get)
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我想创建一个遵循Scala setters/getters约定的Java类.
我试过跟随简单的类,但它不起作用:
public class JavaA {
private int a = 0;
public int a() {
return a;
}
public void a_$eq(int a) {
this.a = a;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从scala访问它时:
val x = new JavaA
x.a = 1
Run Code Online (Sandbox Code Playgroud)
我得到"重新分配给val"错误消息.我试图寻找这个,但是我发现了从scala到java的另一个问题.
做正确的方法是什么?
谢谢!
我对scala.collection.JavaConversions有一个非常基本的问题.我希望以下代码可以工作,但是从java.util.List [String]到scala List [String]的隐式转换不会发生.为什么?
import collection.JavaConversions._
import java.util
class Test {
def getStrings() : List[String] = {
val results : java.util.List[String] = new java.util.ArrayList[String]()
results
}
}
Run Code Online (Sandbox Code Playgroud)
我从compi得到以下消息
type mismatch;
found : java.util.List[String]
required: scala.collection.immutable.List[String]
results
^
Run Code Online (Sandbox Code Playgroud) val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Run Code Online (Sandbox Code Playgroud)
转换null: java.lang.Integer为 Scala的安全方法是什么Option[Int]?
我想将隐式转换添加到由建模工具生成的Java类中.所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们.但我无法将它们添加到单独的文件中,因为必须在同一文件中定义随播广告.我能做些什么吗?
当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入.还有其他方法吗?
scala implicit-conversion scala-java-interop companion-object
为什么所有scala vararg方法,当从java中使用时,似乎接受Seq变量,并且不能用作java本机vararg方法.这是一个错误吗?
例如,Buffer有方法def append(elems: A*): Unit.但在java中它有另一个签名:void append(Seq<A>).
我需要将Scala Option转换为Java Optional.我设法写了这个:
public <T> Optional<T> convertOption2Optional(Option<T> option) {
return option.isDefined() ? Optional.of(option.get()) : Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它.
有一个简单的方法,或内置的scala转换器?我正在寻找类似的东西:
Options.asJava(option);
Run Code Online (Sandbox Code Playgroud)