标签: scala-java-interop

在scala中访问java基类的静态成员

我有一些用Java编写的代码.对于新课程,我打算用Scala编写.我有一个关于访问基类的受保护的静态成员的问题.以下是示例代码:

Java代码:

class Base{
    protected static int count = 20;
}
Run Code Online (Sandbox Code Playgroud)

斯卡拉码:

class Derived extends Base{
    println(count);
}
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?如何在不修改现有基类的情况下解决这个问题

java inheritance static scala scala-java-interop

6
推荐指数
1
解决办法
1685
查看次数

混合Scala和Java:如何获得通用类型的构造函数参数吧?

我有一些遗留Java代码,它在我的控制之外的某处定义了一个泛型payload变量(即我不能改变它的类型):

// Java code
Wrapper<? extends SomeBaseType> payload = ...
Run Code Online (Sandbox Code Playgroud)

我在我的代码中收到了一个payload像方法参数这样的值,并希望将它传递给Scala case class (用作带有actor系统的消息),但是没有得到正确的定义,这样我至少得不到编译器警告.

// still Java code
ScalaMessage msg = new ScalaMessage(payload);
Run Code Online (Sandbox Code Playgroud)

这给出了编译器警告"类型安全:构造函数...属于原始类型......"

Scala case class定义为:

// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T]) 
Run Code Online (Sandbox Code Playgroud)

如何定义案例类以使代码干净地编译?(遗憾的是,更改Java Wrapper类的代码或payload参数的类型不是一个选项)

更新以阐明有效负载参数的来源

添加为了比较,在Java中,我可以像定义payload变量一样定义参数:

// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
Run Code Online (Sandbox Code Playgroud)

并相应地调用它

// Java code
doSomethingWith(payload)
Run Code Online (Sandbox Code Playgroud)

但我不能直接实例化一个Wrapper对象而不会得到"原始类型"警告.在这里,我需要使用static辅助方法:

static <T> Wrapper<T> of(T value) …
Run Code Online (Sandbox Code Playgroud)

java generics types scala scala-java-interop

6
推荐指数
1
解决办法
1493
查看次数

将java.lang.String转换为Scala字符串

我的Scala程序中有一个String,我想把它作为Int转换.

def foo(): Int = x.getTheNumericString().toInt
Run Code Online (Sandbox Code Playgroud)

问题是x.getTheNumericString()来自Java库并返回一个java.lang.String没有toInt方法的.

我知道我可以创建一个Scala字符串 val s: String = "123",但是我注意到当我创建一个像val t = "456"我得到的字符串时java.lang.String. 我听说Scala String只是java.lang.String的包装器,但我还没有找到关于如何转换为Scala字符串的明确文档.

是否有一些我可以使用的功能:

def foo(): Int = f(x.getTheNumericString()).toInt
Run Code Online (Sandbox Code Playgroud)

就目前而言,我的编译器抱怨原始定义 value toInt is not a member of String

java string scala scala-java-interop

6
推荐指数
1
解决办法
7092
查看次数

是否有可能在.java和.scala类之间存在循环依赖?

假设我在.java文件中定义了A类,在.scala文件中定义了B类.
类A使用类B和类B使用类A.
如果我使用java编译器,我将有编译错误,因为类B尚未编译.如果我使用scala编译器,则不会找到类A. 有没有可以一起编译的编译器?

java compiler-construction scala scala-java-interop

5
推荐指数
1
解决办法
472
查看次数

如何转换Java地图以便在Scala中使用?

我正在研究Scala程序,该程序从Java库调用函数,处理结果并吐出CSV.

有问题的Java函数如下所示:

    Map<String, Map<String, AtomicLong>> getData();
Run Code Online (Sandbox Code Playgroud)

斯卡拉:

    import scala.collection.JavaConversions._
    def analysisAndCsvStuff(data: Map[String, Map[String, AtomicLong]]): Unit { ... }
Run Code Online (Sandbox Code Playgroud)

错误:

    type mismatch;
    found:java.util.Map[java...String,java...Map[java...String,java...AtomicLong]]
    required: scala...Map[String,scala...Map[String,java...AtomicLong]]
Run Code Online (Sandbox Code Playgroud)

(路径名称破坏了格式.)

我猜测JavaConversions可以成功转换外部java ... Map而不是内部java ... Map.我看到了这个问题,但我不确定如何编写"显式隐式转换".

java scala type-conversion scala-java-interop

5
推荐指数
1
解决办法
3443
查看次数

Scala/Java互操作性:如何处理包含Int/Long(原始类型)的选项?

给定Scala中的服务:

class ScalaService {
  def process1(s: Option[String], i: Option[Int]) {
    println("1: " + s + ", " + i)
  }
}
Run Code Online (Sandbox Code Playgroud)

这是从Java使用的:

public class Java {
    public static void main(String[] args) {
        ScalaService service = new ScalaService();

        // This works, but it's confusing
        {
            scala.Option<String> so = scala.Option.apply("Hello");
            scala.Option<Object> io = scala.Option.apply((Object) 10);
            service.process1(so, io);
        }

        // Would be OK, but not really nice
        {
            scala.Option<Object> so = scala.Option.apply((Object) "Hello");
            scala.Option<Object> io = scala.Option.apply((Object) 10);
            service.process1(so, io); // Does not …
Run Code Online (Sandbox Code Playgroud)

scala scala-java-interop

5
推荐指数
1
解决办法
4354
查看次数

使用Scala中的Java泛型方法

我在这个例子中遇到了解Scalac错误消息的问题:

Bean.java

public class Bean {
  static public class Attribute<T> {
    public final String name;
    public Attribute(String name) {this.name = name;}
    // equals and hashcode omitted for simplicity
  }

  public <T> void set(Attribute<T> attribute, T value) {}

  public static Attribute<Long> AGE = new Attribute<Long>("age");
}
Run Code Online (Sandbox Code Playgroud)

Test.scala

object Test {
  def test() {
    val bean = new Bean();
    bean.set(Bean.AGE, 2L);
  }
}
Run Code Online (Sandbox Code Playgroud)

编译yeilds this(尝试用scalac 2.9.2):

Test.scala:4: error: type mismatch;
 found   : Bean.Attribute[java.lang.Long]
 required: Bean.Attribute[Any]
Note: java.lang.Long <: Any, but Java-defined class …
Run Code Online (Sandbox Code Playgroud)

generics scala scala-java-interop

5
推荐指数
1
解决办法
662
查看次数

scala运算符作为java中的方法

在操作scala对象(主要来自scala.collection包)时,操作符重载函数似乎可用于Java.

即斯卡拉

var s = Set(1, 2, 3)
var t = s + 4
var x = s | t
Run Code Online (Sandbox Code Playgroud)

所以在Java中,查看scala.collection.Seteclipse自动完成,我可以看到原型

eclipse截图

但是我无法正确使用它们

import scala.collection.Set;

Set<Integer> s = new Set<Integer>();
Set<Integer> t = s.$plus(4); /* compile error with javac, or runtime error with eclipse/*
Run Code Online (Sandbox Code Playgroud)

这些scala方法如何在Java中使用?

java eclipse scala scala-java-interop scala-collections

5
推荐指数
1
解决办法
179
查看次数

避免使用`Boolean.box`

我正在调用一个io.netty.bootstrap.BootStrap具有以下签名的java方法:

public <T> B option(ChannelOption<T> option, T value)
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来调用此方法:

b.option(ChannelOption.SO_KEEPALIVE, true);
Run Code Online (Sandbox Code Playgroud)

这无法编译,出现以下错误:

Error:(57, 30) type mismatch;
 found   : io.netty.channel.ChannelOption[Boolean]
 required: io.netty.channel.ChannelOption[Any]
Note: Boolean <: Any, but Java-defined class ChannelOption is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
      b.option(ChannelOption.SO_KEEPALIVE, true); // (4)
                         ^
Run Code Online (Sandbox Code Playgroud)

我不完全理解这说的是什么,但我理解它抱怨得到一个布尔值,因为它是参数化 Any而不是Boolean.所以我尝试了以下代码,它的工作原理:

b.option(ChannelOption.SO_KEEPALIVE, Boolean.box(true));
Run Code Online (Sandbox Code Playgroud)

这编译和工作.有没有办法让这个更漂亮没有box电话?

有人可以翻译那个编译错误吗?

谢谢.

scala scala-java-interop

5
推荐指数
1
解决办法
588
查看次数

如何在Scala中覆盖`org.elasticsearch.client.FilterClient#doExecute()`?

特别是"org.elasticsearch" % "elasticsearch" % "2.4.x"(它确实适用ActionRequest不再采用参数类型的ElasticSearch的更高版本,但我们无法更新到那些!).

我们试图覆盖的Java方法定义如下(source):

protected <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
    in().execute(action, request, listener);
}
Run Code Online (Sandbox Code Playgroud)

天真的企图覆盖它......

import org.elasticsearch.action._
import org.elasticsearch.client.{Client, FilterClient}

class DemoFilterClient(underlyingClient: Client) extends FilterClient(underlyingClient) {
  override def doExecute[
    Request <: ActionRequest[_],
    Response <: ActionResponse,
    RequestBuilder <: ActionRequestBuilder[Request, Response, RequestBuilder]
  ](
    action: Action[Request, Response, RequestBuilder],
    request: Request,
    listener: ActionListener[Response]
  ) = super.doExecute(action, request, listener) …
Run Code Online (Sandbox Code Playgroud)

scala scala-java-interop elasticsearch-2.4

5
推荐指数
1
解决办法
239
查看次数