我在构造函数上使用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)
我想知道是否有任何我想念的东西.任何不需要重复参数默认值的想法?
谢谢!
假设我在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泛型可以根据表达式的返回类型推断泛型类型参数的类型.考虑以下:
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) 我们在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会阻止两个期货相互干扰,但显然可能并非如此.
为什么List[scala.Int]类型擦除,以List[Object]同时Integer在List[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”子句引起的吗?如果是这样,此界限在哪里指定?
我正在使用Netbeans编写Scala和Java.
Netbeans为Scala项目生成了一个.jar文件.我尝试在Java项目中导入该文件.但我无法将该.jar文件中的任何类导入到我的Java项目中.
我也尝试将scala-library.jar导入java项目,并可以从该jar导入类.
我想在Scala中编写我的库,然后公开一个只涉及Java东西的小接口,然后编写一个Java包装器,以便人们可以将它用作Java包.那可能吗?我该怎么做?
非常感谢你.
给定以下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) 我有两个项目,一个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.没有例外被抛出.
作为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.令人沮丧的是,至少可以说:(
我正在尝试实现一个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) scala ×10
java ×8
reflection ×2
concurrency ×1
constructor ×1
generics ×1
interop ×1
stanford-nlp ×1
type-alias ×1
type-erasure ×1