2012-05-18 19 views
11

इंटरऑपरेबिलिटी के लिए, मुझे जावा कोड से स्कैला पार्टियल फ़ंक्शन को पास करने की आवश्यकता है। फ़ंक्शन (फ़ंक्शन 1 और इसी तरह) के लिए, सार तत्व है जिसे मैं अज्ञात प्रकार से उपclass कर सकता हूं, लेकिन पार्टियल फ़ंक्शन के लिए ऐसा करने का सबसे आसान तरीका क्या होगा?जावा में स्कैला आंशिक समारोह को कार्यान्वित करने का सबसे आसान तरीका क्या है?

इस मामले में, मुझे जावा में "पूर्ण" फ़ंक्शन होने से प्रसन्नता होगी, जो सभी मानों के लिए परिभाषित दिखाई दे रहा है, लेकिन आंशिक कार्य के रूप में टाइप किया गया है।

//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); 
} 

फिर, स्केला में (यानी एक स्केला पुस्तकालय पर निर्भर:

उत्तर

9

क्या मैं यहाँ करना होगा जावा में एक इंटरफेस प्रदान (जो स्केला-बारे में पता नहीं है) कुछ आम पुस्तकालय में है जावा पुस्तकालय) से ऊपर, एक 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 
    } 
    } 
} 

फिर अपने जावा कोड कर सकते हैं:

//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) { /* */ } 
} 

आप MyPartialFunctions$.MODULE$ वाक्य रचना पसंद नहीं है, यह संभव स्केला पुस्तकालय में, एक जावा वर्ग जो आप से छुपाता है:

//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); 
    } 
} 

फिर अपने कॉल-साइट इस तरह दिखता है:

//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) { /* */ } 
} 

इसमें शामिल है, अहम, संकेत के कुछ स्तर! http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html

+0

मैंने स्कैला में कुछ रैपर/फैक्ट्री बनाने पर विचार किया है। हालांकि, इस परियोजना के लिए मैं स्कैला में खुद को कोई कोड नहीं बना सकता। – SoftMemes

6

'क्रिस जवाब देने के लिए एक पूरक के रूप में, स्काला 2.10 में आप इस का उपयोग कर सकते ।

+0

धन्यवाद। कोई विचार जब स्कैला 2.10 के लिए अक्का जारी किया जाएगा? – SoftMemes

+0

कुछ समय पर जब स्कैला 2.10 जारी किया गया था। –

संबंधित मुद्दे

 संबंधित मुद्दे