gpt4 book ai didi

java - java API 的 Scala 包装器 API

转载 作者:行者123 更新时间:2023-12-02 03:36:59 24 4
gpt4 key购买 nike

我是 Scala 新手,我需要为我的 Java API 提供一个 scala 包装器

我有三个 Java 接口(interface)

public interface Client<T> {

<T> Future<T> execute(App<T> app);

}

public interface App<T> extends Serializable{

T process(AppContext context) throws Exception;

}

public interface AppContext {

File getDirectory();

void deleteDirectory();

File createDirectory(String path);

}

以下是创建应用程序的Java代码

public class RandomApp extends App<String> {

@Override
public String process(AppContext context) {

// Inorder to access the methods in AppContext I need to access
// it by the following way

appContext.createDirectory("some path");
return "random";
}
}

我想要一个用于客户端接口(interface)的 Scala 包装器,它反过来调用 Java API。但我对新的 Scala API 有一些修改

object ScalaConverter {

implicit class ScalaWrapper(client: Client) {

def scalaClient = new ScalaClient(client)

}
}

class ScalaClient(client: Client) {

def execute[T](appContext: AppContext => T): Future[T] = {

// I am passing appContext as closure instead of passing in
// App because I want to take the advantage of Closures in Scala

// I basically want to create an App with this appContext and
// pass it to the execute method

// For example - but this is not working

var app = // Need to create this app with appContext

Future {
client.execute(app)
}
}

}

最佳答案

如果我没记错的话,您只是希望能够从一个以 AppContext 作为参数并返回任何对象(假设为 T)的函数创建 App 对象。

由于尝试镜像整个 java API 并不是很有趣,因此只需按原样使用它,但添加一些扩展。为此,您应该使用隐式。

为此,我看到两种可能性:要么在 Client 接口(interface)上添加隐式类以向其添加一些函数,要么添加来自 (AppContext => T) 的隐式转换App 对象。

让我们采用第一个解决方案,您必须将隐式类嵌入到一个对象中(如果需要自动导入,这可以是包对象)。

object ScalaConverter {
class ScalaApp[T](val block: AppContext => T) extends App[T] {
def process(context: AppContext): T = block(context)
}

implicit class ScalaClient(client: Client) extends AnyVal{
def execute[T](block: AppContext => T): Future[T] = {
client.execute(new ScalaApp(block))
}
}
}

然后,您只需使用现有的 java Client 对象即可:

import ScalaConverter._
myJavaClient.execute { context =>
???
}

你应该明白原理了,我可能犯了一个错误(没有尝试编译这个)

关于java - java API 的 Scala 包装器 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37339346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com