Domanda

Per l'interoperabilità, ho bisogno di superare una parte parziale Scala dal codice Java.Per la funzione (funzione1 e così via), c'è una frazione astratto che posso sottoclasse con un tipo anonimo, ma quale sarebbe il modo più semplice per fare lo stesso per la parte parziale?

In questo caso, sarei felice di avere una funzione "completa" in Java, apparendo definito per tutti i valori, ma digitato come parziale.

È stato utile?

Soluzione

Se è possibile utilizzare Twitter Util Library, ha una classe specifica per questo: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function.HTML che è fondamentalmente la stessa soluzione di AstentPartialFunction.

Altri suggerimenti

Quello che vorrei fare qui è fornire un'interfaccia in Java, in una biblioteca comune (che non è Scala-Aware):

//this is Java - in the Java lib
abstract class PartialTransformer<I, O> {
    abstract public boolean isDefinedAt(I i);
    public O transform(I i) {
        if (isDefinedAt(i)) {
            return transform0(i);
        }
        return null;
    }
    abstract protected O transform0(I i);
}
.

Allora, in Scala (cioè una Biblioteca Scala dipendente dalla Biblioteca Java sopra), convertire un'implementazione di questo su un PartialFunction:

//this is scala - in the scala lib
object MyPartialFunctions {
  def fromPartialTransformer[I, O](t: PartialTransformer[I, O]) = new PartialFunction[I, O] {
    def isDefinedAt(i: I) = t isDefinedAt i
    def apply(i: I) = {
      val r = t transform i
      if (r eq null) throw new MatchError
      else r
    }
  }
}
.

Allora il tuo codice Java può fare questo:

//This is Java - in your client code
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer<Integer, String>() {
    @Override public boolean isDefinedAt(Integer i) { /* */ }
    @Override protected String transform0(Integer i) { /* */ }
}
.

Se non ti piace la sintassi MyPartialFunctions$.MODULE$, è possibile nella Bilancia Scala , A Java Class che si nasconde da te:

//This is Java - in the scala-lib
public class ScalaUtils {
    public <I, O> scala.PartialFunction<I, O> toPartialFunction(PartialTransformer<I, O> t) {
         MyPartialFunctions$.MODULE$.fromPartialTransformer(t);
    }
}
.

Allora il tuo sito di chiamata è simile a questo:

//This is Java - in your client code
ScalaUtils.toPartialFunction(new PartialTransformer<Integer, String>() {
    @Override public boolean isDefinedAt(Integer i) { /* */ }
    @Override protected String transform0(Integer i) { /* */ }
}
.

Questo coinvolge, ahem, alcuni livelli di indirezione!

Come complemento alla risposta di Chris, in Scala 2.10 è possibile utilizzare questo: http://www.scala-lang.org/HERCIVES/Downloads/Distrib/files/nightly/docs/library/Scala/Runtime/abStractPartialFunction.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top