我有一些用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代码,它在我的控制之外的某处定义了一个泛型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) 我的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文件中定义了A类,在.scala文件中定义了B类.
类A使用类B和类B使用类A.
如果我使用java编译器,我将有编译错误,因为类B尚未编译.如果我使用scala编译器,则不会找到类A. 有没有可以一起编译的编译器?
我正在研究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.我看到了这个问题,但我不确定如何编写"显式隐式转换".
给定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) 我在这个例子中遇到了解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) 在操作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自动完成,我可以看到原型

但是我无法正确使用它们
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中使用?
我正在调用一个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电话?
有人可以翻译那个编译错误吗?
谢谢.
特别是"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)