当前位置: 首页 > 知识库问答 >
问题:

包装器scala APIJavaAPI

姜永贞
2023-03-14

我是Scala新手,我正在为我的Java API构建一个Scala包装器

我有四个Java接口

public interface Client<T> {
 <T> Handle<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);
}

public interface Handle<T> extends Future<T> {
   static interface Listener<T> {          
       void onSuccess(Handle<T> handle)
       void onFailure(Handle<T> handle, Throwable e)
   }

   void addListener(Listener<T> listener);
}

这是我的 Scala 等效项

trait Process[T] extends Future[T] { 
  // Few abstract methods
}


class ProcessImpl[T](handle: Handle[T]) extends Process[T] {

val promise = Promise[T]

override def isCompleted: Boolean = ???

override def onComplete[U](func: (Try[T]) => U)(implicit executor: ExecutionContext)  = {
  case Success(t) => promise.success(handle.get())
  case Failure(e) => promise.failure(e)
   }

override def value: Option[Try[T]] = ???

@throws(classOf[Exception])
override def result(atMost: Duration)(implicit permit: CanAwait): T = ???

@throws(classOf[InterruptedException])
@throws(classOf[TimeoutException])
override def ready(atMost: Duration)(implicit permit: CanAwait) = ???

 } 


class ScalaClient(javaClient: Client) {
   def execute[T](func: AppContext => T): ScalaHandle[T] = {
     val app = new App[T]
     @throws(classOf[Exception])
     override def process(AppContext context): T = func(context)

     val handle = javaClient.execute(app) // This returns a Handle obj. I want to convert it to ScalaHandle

    //My approach

     val scalahandle = new ProcessImpl(handle)       
     scalahandle
  }
}

我得到以下错误

匿名函数的参数类型必须完全已知。(补充说明8.5)

预期的类型为:单元覆盖def onComplete[U](func:(Try[T])=

此外,我想知道我的方法是否正确

共有1个答案

琴光亮
2023-03-14

您的问题不在于 onComplete 本身,而在于您实现它的方式。

override def onComplete[U](func: (Try[T]) => U)(implicit executor: ExecutionContext)  = {
  case Success(t) => promise.success(test.get())
  case Failure(e) => promise.failure(e)
}

在这里,您将< code>onComplete定义为某个函数< code>Try[_] =

作为旁注,我不得不提到,你永远不应该延长< code >未来。一个非常有用的格言是,不惜任何代价避免继承。就你的情况而言,我认为遗传不会给你带来任何好处——相反,它会增加困惑。

你可能在找的是,

def asFuture[T](handle: Handle[T]): Future[T] = {
  val promise = Promise[T]()
  handle.addListener(new Handle.Listener[T] {
    def onSuccess(handle: Handle[T]) {
      promise.trySuccess(handle.get())
    }
    def onFailure(handle: Handle[T], e: Throwable) {
      promise.tryFailure(e)
    }
  })
  promise.future
}
 类似资料:
  • 我在面试中被问到以下问题 它们将在哪个内存中创建? 根据我的理解 对于 原始数据类型进入堆栈内存,并且 对于 包装类进入堆内存的整数 请帮助正确理解?

  • 你把你的Web应用给你的同伴Mike看,他看完之后觉得很有意思想加入你给项目添加一些高级特性。你把代码添加到版本控制系统当中(VCS),因此它可以下载代码,由于Mike从来没有用过Gradle构建工具,所以他问你用的哪个版本的Gradle以及怎么安装Gradle,他也不知道怎么去配置Gradle,从以往的经验来看,Mike清醒的知道不同版本的构建工具或者运行环境对对构建的影响有多大。对于在一个机器

  • TimeDistributed包装器 keras.layers.wrappers.TimeDistributed(layer) 该包装器可以把一个层应用到输入的每一个时间步上 参数 layer:Keras层对象 输入至少为3D张量,下标为1的维度将被认为是时间维 例如,考虑一个含有32个样本的batch,每个样本都是10个向量组成的序列,每个向量长为16,则其输入维度为(32,10,16),其不

  • TimeDistributed包装器 keras.layers.wrappers.TimeDistributed(layer) 该包装器可以把一个层应用到输入的每一个时间步上 参数 layer:Keras层对象 输入至少为3D张量,下标为1的维度将被认为是时间维 例如,考虑一个含有32个样本的batch,每个样本都是10个向量组成的序列,每个向量长为16,则其输入维度为(32,10,16),其不

  • freemarker.ext.jython 包包含了启用任意Jython对象的模型, 并被用作是TemplateModel。在一个基础的示例中, 你可以使用如下调用: public TemplateModel wrap(Object obj); freemarker.ext.jython.JythonWrapper 类的方法。 这个方法会包装传递的对象,包装成合适的 TemplateModel。

  • 本文向大家介绍Java Float包装器类,包括了Java Float包装器类的使用技巧和注意事项,需要的朋友参考一下 Float是提供的包装类,用于包装float基本值。 让我们创建一个带有float原语的Float对象。 现在让我们从字符串创建一个Float对象。 下面的示例显示了上面讨论的两种输出方法。 示例 输出结果