java API 的 Scala 包装器 API
Scala wrapper API for java API
我是 Scala 的新手,我需要为我的 Java API
提供一个 Scala 包装器
我有三个 Java 接口
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";
}
}
我想要一个用于客户端接口的 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 作为参数并且 returns 任何对象(假设为 T)的函数中创建 App 对象。
因为尝试镜像整个 java API 并不是很有趣,所以就按原样使用它,但添加一些扩展。为此,您应该使用隐含函数。
为此,我看到了两种可能性:要么在 Client
接口上添加隐式 class 以向其添加一些功能,要么添加从 (AppContext => T)
到的隐式转换App
个对象。
让我们使用第一个解决方案,你必须将隐式 class 嵌入到一个对象中(如果你需要自动导入,这可以是一个包对象)。
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 客户端对象:
import ScalaConverter._
myJavaClient.execute { context =>
???
}
原理你应该明白了,可能是我弄错了(没试过编译这个)
我是 Scala 的新手,我需要为我的 Java API
提供一个 Scala 包装器我有三个 Java 接口
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";
}
}
我想要一个用于客户端接口的 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 作为参数并且 returns 任何对象(假设为 T)的函数中创建 App 对象。
因为尝试镜像整个 java API 并不是很有趣,所以就按原样使用它,但添加一些扩展。为此,您应该使用隐含函数。
为此,我看到了两种可能性:要么在 Client
接口上添加隐式 class 以向其添加一些功能,要么添加从 (AppContext => T)
到的隐式转换App
个对象。
让我们使用第一个解决方案,你必须将隐式 class 嵌入到一个对象中(如果你需要自动导入,这可以是一个包对象)。
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 客户端对象:
import ScalaConverter._
myJavaClient.execute { context =>
???
}
原理你应该明白了,可能是我弄错了(没试过编译这个)