Was ich hier tun würde, ist eine Schnittstelle in Java in einer allgemeinen Bibliothek bereitzustellen (die nicht scala-bewusst ist):
//this is Java - in the Java lib
abstract class PartialTransformer {
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);
}
Dann, in Scala (d.h. eine Scala-Bibliothek, die von der oben genannten Java-Bibliothek abhängt), wandeln Sie eine Implementierung davon in eine PartialFunction
um:
//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
}
}
}
Dann kann Ihr Java-Code das folgendes tun:
//This is Java - in your client code
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer() {
@Override public boolean isDefinedAt(Integer i) { /* */ }
@Override protected String transform0(Integer i) { /* */ }
}
Wenn Ihnen die Syntax MyPartialFunctions$.MODULE$
nicht gefällt, ist es möglich in der Scala-Bibliothek, eine Java-Klasse zu haben, die dies von Ihnen versteckt:
//This is Java - in the scala-lib
public class ScalaUtils {
public scala.PartialFunction toPartialFunction(PartialTransformer t) {
MyPartialFunctions$.MODULE$.fromPartialTransformer(t);
}
}
Dann sieht Ihr Aufruf so aus:
//This is Java - in your client code
ScalaUtils.toPartialFunction(new PartialTransformer() {
@Override public boolean isDefinedAt(Integer i) { /* */ }
@Override protected String transform0(Integer i) { /* */ }
}
Dies beinhaltet, ähm, ein paar Ebenen von Indirektion!