标签: scala-java-interop

Scala额外的无参数构造函数以及默认构造函数参数

我在构造函数上使用Scala 2.8默认参数,出于Java兼容性原因,我想要一个使用默认参数的无参数构造函数.

这不是出于非常明智的原因:

class MyClass(field1: String = "foo", field2: String = "bar") {
    def this() = {
        this() // <-- Does not compile, but how do I not duplicate the defaults?
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何我想念的东西.任何不需要重复参数默认值的想法?

谢谢!

constructor scala default-parameters scala-java-interop

9
推荐指数
1
解决办法
8162
查看次数

使用Java代码中的Scala类型别名

假设我在scala中定义了类型别名

object Foo {
  type Bar = Option[String]
}
Run Code Online (Sandbox Code Playgroud)

看起来我不能像Java那样在Java代码中引用别名(它只是抱怨无法找到符号):

import Foo.*;

public class Cafebabe {
  void bar(Bar x) {
  //...
  }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过静态导入.

(更具体地说,我有java反射代码,我无法更改,需要知道参数类型,我需要将Bar别名提供给它).

我知道,我可以在Scala中创建包装器

class BarWrapper(value: Bar)
Run Code Online (Sandbox Code Playgroud)

但也许我错过了其他一些方式?

java scala scala-java-interop type-alias

9
推荐指数
1
解决办法
1315
查看次数

Scala和Java Generics - 提取和返回嵌套类型

Java泛型可以根据表达式的返回类型推断泛型类型参数的类型.考虑以下:

public static <T> T uncheckedCast(Object o) {
    return (T)o;
}
Run Code Online (Sandbox Code Playgroud)

我们可以称之为:

Map<Baz,Bog> bazbogMap = new HashMap<Baz,Bog>();
String foo = uncheckedCast(bazbogMap);
Run Code Online (Sandbox Code Playgroud)

这将编译但RuntimeException在调用时抛出一个,因为它会尝试将其转换Map为a String但是失败.但重点是Java <T>根据呼叫站点的预期结果类型推断出值.

我们也可以在Scala中执行以下操作:

def uncheckedCast[T](o: AnyRef): T = o.asInstanceOf[T]
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

Java还可以从嵌套定义中推断出类型参数并返回它们(即我们实际上不必将结果分配给类型,以便在使用它之前使用它; Java知道它已经是什么.)

一个简单的类显示:

import java.util.HashMap;
import java.util.Map;

public class KeysAndValues {
    public interface Key<T> {}
    public static class StringKey implements Key<String> {}

    private final Map<Class<?>, Object> lookup;

    public KeysAndValues() {
        lookup = new HashMap<Class<?>, Object>();
    }

    @SuppressWarnings("unchecked")
    public <V, K extends Key<V>> …
Run Code Online (Sandbox Code Playgroud)

java generics scala stanford-nlp scala-java-interop

9
推荐指数
1
解决办法
1817
查看次数

Scala和Java期货显然有意想不到的相互作用

我们在Scala Play Framework应用程序中使用Elasticsearch 0.90.7,其中"doSearch"方法的结尾如下所示:

def doSearch(...) = {
  ...
  val actionRequessBuilder: ActionRequestBuilder // constructed earlier in the method
  val executedFuture: ListenableActionFuture<Response> = actionRequestBuilder.execute
  return executedFuture.actionGet
}
Run Code Online (Sandbox Code Playgroud)

在哪里ListenableActionFuture延伸java.util.concurrent.Future,和ListenableActionFuture#actionGet基本相同Future#get

当我们按顺序执行搜索时,这一切都正常,但是当我们尝试并行执行多个搜索时:

val search1 = scala.concurrent.Future(doSearch(...))
val search2 = scala.concurrent.Future(doSearch(...))
return Await.result(search1, defaultDuration) -> Await.result(search2, defaultDuration))
Run Code Online (Sandbox Code Playgroud)

我们有时(不到1%或2%的时间)在我们的scala期货上获得意外超时,即使在qa期间使用极长的超时(5秒,搜索总是在不到200ms内执行).使用scala全局执行上下文以及使用Play默认执行上下文时也会发生这种情况.

由于Java未来包含在scala未来中,是否存在某种意外的交互?我原本以为actionGet在结束时对java未来的调用doSearch会阻止两个期货相互干扰,但显然可能并非如此.

java concurrency multithreading scala scala-java-interop

9
推荐指数
1
解决办法
201
查看次数

List [Int]和List [Integer]的类型擦除的差异

为什么List[scala.Int]类型擦除,以List[Object]同时IntegerList[java.lang.Integer]似乎会保留吗?例如,javap对于

object Foo {
  def fooInt: List[scala.Int] = ???
  def fooInteger: List[java.lang.Integer] = ???
}
Run Code Online (Sandbox Code Playgroud)

输出

public scala.collection.immutable.List<java.lang.Object> fooInt();
public scala.collection.immutable.List<java.lang.Integer> fooInteger();
Run Code Online (Sandbox Code Playgroud)

我们看到的Integer是第二种情况。文档状态

Object如果泛型类型中的所有类型参数都带有边界,或者类型参数不受限制,则将其替换。

这可能是由于“ bounds”子句引起的吗?如果是这样,此界限在哪里指定?

java scala type-erasure scala-java-interop

9
推荐指数
1
解决办法
114
查看次数

从Java调用Scala代码?

我正在使用Netbeans编写Scala和Java.

Netbeans为Scala项目生成了一个.jar文件.我尝试在Java项目中导入该文件.但我无法将该.jar文件中的任何类导入到我的Java项目中.

我也尝试将scala-library.jar导入java项目,并可以从该jar导入类.

我想在Scala中编写我的库,然后公开一个只涉及Java东西的小接口,然后编写一个Java包装器,以便人们可以将它用作Java包.那可能吗?我该怎么做?

非常感谢你.

java interop scala scala-java-interop

8
推荐指数
1
解决办法
2516
查看次数

我可以在没有Java括号的情况下访问Scala对象的val吗?

给定以下Scala对象:

object ScalaObject {
    val NAME = "Name"
}
Run Code Online (Sandbox Code Playgroud)

似乎Scala编译器生成一个无参数的方法来访问该NAME字段.但是,当我尝试从Java访问此字段时,看起来访问此字段的唯一方法是作为无参数方法,如:

System.out.println(ScalaObject$.MODULE$.NAME());
Run Code Online (Sandbox Code Playgroud)

有没有办法哄骗Scala编译器,允许Java val按照预期的Java习惯用法访问:

System.out.println(ScalaObject$.MODULE$.NAME);
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

8
推荐指数
1
解决办法
908
查看次数

如何让java方法注释在scala中工作

我有两个项目,一个scala项目和一个java项目.我的scala项目引用了构建路径中的java项目.在我的java项目中,我正在声明以下注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    public String Name();
}
Run Code Online (Sandbox Code Playgroud)

在我的scala项目中,我正在注释一些方法.即

class MyClass {
    ...
    @MyAnnotation(Name="Blah")
    def myMethod() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在某个地方的另一个文件中,我正在尝试提取注释.

var methods = myClassInstance.getClass().getDeclaredMethods()
var myMethod : Method = null
for (method <- methods) {
  if (method.getName().equals("myMethod")) {
    myMethod = method
  }
}
var annotations = myMethod.getDeclaredAnnotations()
Run Code Online (Sandbox Code Playgroud)

不幸的是,annotations总是一个空数组.我做了一些根本错误的事情,还是我只是遗漏了一些小事?谢谢!

编辑 最初,我用myAnnotation两次注释myMethod,这是不正确的,正如有人指出的那样.事实证明这不是问题.我仍然得到一个空数组annotations.没有例外被抛出.

java reflection scala scala-java-interop

8
推荐指数
1
解决办法
2810
查看次数

使用Scala反射和Java反射

作为DSL的一部分,我有很多代码使用Java反射来调用Java对象上的任意用户指定方法.

但是,实际上很多Java对象都是Scala对象,并且它们上的一些方法都标有Scala @deprecated注释.不幸的是,Java的注释机制无法看到Scala注释,直到Scala 2.10没有方便的方式(我知道?)才能访问这些注释.

我最终升级到2.10,并希望能够从我的DSL发出弃用警告.但是,我不想重写整个评估器(至少现在)使用Scala反射,所以有一种方便的方法从一个java.lang.reflect.Method我可以使用Scala反射的东西来弄清楚Scala方法是否在问题已被弃用?或者,在获取该信息之前,我是否必须使用Scala反射复制许多现有的方法解析逻辑?

它看起来像一个JavaToScala曾经存在于Scala反射中的类,它有一个methodToScala方法可以实现我想要的.在谷歌代码项目中,我能找到的唯一痕迹就在这里.为什么功能移出核心反射?或者它仍然以不同的名称存在?

编辑:看起来有问题的代码存在scala.reflect.runtime.JavaMirrors,但不幸的是它是私有的(有另一个JavaMirrors是公共API的一部分,但不提供我需要的任何东西.)我无法弄清楚它的生命如果有一个通过公共API进行调用的"路径",那么我就会把我一直带到私有的methodAsScala深处JavaMirrors.令人沮丧的是,至少可以说:(

reflection scala scala-java-interop

8
推荐指数
1
解决办法
1196
查看次数

在Java中实现Scala函数

我正在尝试实现一个scala函数对象(具体来说 - 与apache spark一起使用)

等效的java类型是scala.Function0(对于参数少的函数)

除了实现业务逻辑的方法apply(),我看到我必须实现其他几个方法.

简单的谷歌搜索方法名称没有帮助(我看到了关于tag应该实现的方法的参考- 但这里的方法名称是不同的.

这是使用这些方法的代码(使用空实现).

    private static class functionObject implements Function0<Integer>{

    @Override
    public Integer apply() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public byte apply$mcB$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public char apply$mcC$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public double apply$mcD$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public float apply$mcF$sp() {
        // TODO …
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

8
推荐指数
1
解决办法
1726
查看次数