标签: scala-java-interop

抽象方法和varargs注释

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 scala variadic-functions scala-java-interop

13
推荐指数
1
解决办法
838
查看次数

从Java属性获取Scala映射

我试图使用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),在此先感谢; @)

collections scala map scala-java-interop

12
推荐指数
3
解决办法
1万
查看次数

什么是Scala对象的Java等价物?

在Scala中,我们可以写

object Foo { def bar = {} }
Run Code Online (Sandbox Code Playgroud)

这是如何由编译器实现的?我能够Foo.bar();从Java 调用,但是new Foo();从Java中调用错误cannot find symbol symbol: constructor Foo()

  • JVM本身是否支持单例?
  • 是否有可能在Java中有一个没有构造函数的类?

注意:这是输出的代码 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 scala scala-java-interop

12
推荐指数
2
解决办法
2309
查看次数

将Java Future转换为Scala Future

我有一个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 future scala-java-interop

12
推荐指数
4
解决办法
8649
查看次数

Java类中的Scala getter和setter

我想创建一个遵循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的另一个问题.

做正确的方法是什么?

谢谢!

java scala getter-setter scala-java-interop

11
推荐指数
1
解决办法
2352
查看次数

不会发生java.util.List到scala List的隐式转换

我对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)

java scala implicit-conversion scala-java-interop

11
推荐指数
2
解决办法
6834
查看次数

Scala Option(null) 预期为 None 但我得到了 Some(0)

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]

scala optional scala-java-interop

11
推荐指数
2
解决办法
962
查看次数

在Scala中,如何为Java中定义的类定义伴随对象?

我想将隐式转换添加到由建模工具生成的Java类中.所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们.但我无法将它们添加到单独的文件中,因为必须在同一文件中定义随播广告.我能做些什么吗?

当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入.还有其他方法吗?

scala implicit-conversion scala-java-interop companion-object

10
推荐指数
2
解决办法
2227
查看次数

在java中使用scala vararg方法

为什么所有scala vararg方法,当从java中使用时,似乎接受Seq变量,并且不能用作java本机vararg方法.这是一个错误吗?

例如,Buffer有方法def append(elems: A*): Unit.但在java中它有另一个签名:void append(Seq<A>).

scala scala-java-interop scala-collections

10
推荐指数
2
解决办法
1111
查看次数

将Scala选项转换为Java可选

我需要将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)

java scala scala-java-interop

10
推荐指数
3
解决办法
1万
查看次数