Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何序列化Scala lambda以实现与Java方法的互操作?_Java_Scala_Serialization_Scala Java Interop - Fatal编程技术网

如何序列化Scala lambda以实现与Java方法的互操作?

如何序列化Scala lambda以实现与Java方法的互操作?,java,scala,serialization,scala-java-interop,Java,Scala,Serialization,Scala Java Interop,我有一个Java方法,它有一个接口类型SerializablePredicate的参数 @FunctionalInterface interface SerializablePredicate<T> extends Predicate<T>, Serializable {} 这样它将与Java方法兼容 目前我正在尝试铸造lambda class SomeClass[T](val p:(T=>Boolean)) extends SomeJavaClass[T](p.

我有一个Java方法,它有一个接口类型SerializablePredicate的参数

@FunctionalInterface
interface SerializablePredicate<T> extends Predicate<T>, Serializable {}
这样它将与Java方法兼容

目前我正在尝试铸造lambda

class SomeClass[T](val p:(T=>Boolean)) extends SomeJavaClass[T](p.asInstanceOf[SerializablePredicate[T]]) {}
这是我得到的堆栈跟踪

Exception in thread "main" java.lang.ClassCastException: Main$$anonfun$1 cannot be cast to io.cognitionbox.core.SerializablePredicate
at P.<init>(LogicJavaToScalaInterp.scala:11)
at Main$.delayedEndpoint$Main$1(Main.scala:9)
at Main$delayedInit$body.apply(Main.scala:3)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Main$.main(Main.scala:3)
at Main.main(Main.scala)
线程“main”java.lang.ClassCastException中的异常:无法将main$$anonfun$1强制转换为io.cognitionbox.core.SerializablePredicate 在P.(LogicJavaToScalInterp.scala:11) 在Main$.delayedEndpoint$Main$1处(Main.scala:9) 在Main$delayedInit$body.apply处(Main.scala:3) 在scala.Function0$class.apply$mcV$sp处(Function0.scala:34) 在scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)中 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.collection.immutable.List.foreach(List.scala:381) 位于scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 位于scala.App$class.main(App.scala:76) 在Main$.Main(Main.scala:3) 在Main.Main(Main.scala)
您不能将Scala
函数
转换为Java
函数
,它们是不同的东西。但您可以尝试这样做:

class SomeClass[T](val p:(T=>Boolean)) extends SomeJavaClass[T]((t: T) => p.apply(t)) {}
在上面的代码中:
(t:t)=>p.apply(t)
,为类
SomeJavaClass
创建一个新的
SerializablePredicate
JavaFunctionInterface实例

有一个将Scala
函数
转换为Java
函数的示例:

Foo
功能界面:

@FunctionalInterface
public interface Foo<T> { // Define a Java FunctionalInterface
    T apply(T t);
}
因此,在Scala中,我们可以通过以下方式将Scala
函数
传递给Java

class B(c: String => String) extends A((t: String) => c.apply(t)) // convert c of Scala Function to Java Function
val s: String => String = s => s.toUpperCase
val b = new B(s) 

您不能将Scala
函数
转换为Java
函数
,它们是不同的东西。但您可以尝试这样做:

class SomeClass[T](val p:(T=>Boolean)) extends SomeJavaClass[T]((t: T) => p.apply(t)) {}
在上面的代码中:
(t:t)=>p.apply(t)
,为类
SomeJavaClass
创建一个新的
SerializablePredicate
Java
FunctionInterface实例

有一个将Scala
函数
转换为Java
函数的示例:

Foo
功能界面:

@FunctionalInterface
public interface Foo<T> { // Define a Java FunctionalInterface
    T apply(T t);
}
因此,在Scala中,我们可以通过以下方式将Scala
函数
传递给Java

class B(c: String => String) extends A((t: String) => c.apply(t)) // convert c of Scala Function to Java Function
val s: String => String = s => s.toUpperCase
val b = new B(s) 

由于
SerializablePredicate
是一个SAM(单一抽象方法)接口,在Scala 2.12中,您只需编写

new SomeJavaClass(x => ...)
lambda将被编译成一个
SerializablePredicate
。如果需要支持较旧的Scala版本,可以创建隐式转换:

implicit def makeSerializable[A](p: A => Boolean): SerializablePredicate[A] = new SerializablePredicate[A] {
  def test(x: A) = p(x) // or whatever Predicate's method is called
}
只要它在作用域中,您就可以将lambda传递给采用
SerializablePredicate
的方法/类


请注意,在这两种情况下,您都必须确保lambda实际上是可序列化的,即不捕获任何不可序列化的对象。

因为
serializabledpredicate
是SAM(单一抽象方法)接口,所以在Scala 2.12中,您只需编写

new SomeJavaClass(x => ...)
lambda将被编译成一个
SerializablePredicate
。如果需要支持较旧的Scala版本,可以创建隐式转换:

implicit def makeSerializable[A](p: A => Boolean): SerializablePredicate[A] = new SerializablePredicate[A] {
  def test(x: A) = p(x) // or whatever Predicate's method is called
}
只要它在作用域中,您就可以将lambda传递给采用
SerializablePredicate
的方法/类


请注意,在这两种情况下,您都必须确保lambda实际上是可序列化的,即不捕获任何不可序列化的对象。

我不确定您所说的“在上述代码中:(t:t)=>p.apply(t),为类SomeJavaClass创建一个新的SerializablePredicate Java FunctionInterface实例”是什么意思,你能提供一个例子吗?我不确定你所说的“在上面的代码中:(t:t)=>p.apply(t),为SomeJavaClass类创建一个新的SerializablePredicate Java FunctionInterface实例”是什么意思,你能提供一个例子吗?你知道如何委托给一个返回void的Java方法吗?
void
的Scala等价物是
Unit
,除了它是实类型。你知道如何委托给一个返回void的Java方法吗?
void
的Scala等价物是
Unit
,除了它是实类型。