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 => 
   ???
}

原理你应该明白了,可能是我弄错了(没试过编译这个)