2009-06-15 10 views
9

मैं स्कैला कोड से जावा क्लास लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। (। JGraphT, सटीक होना करने के लिए) कंस्ट्रक्टर्स मैं फोन करने की जरूरत में से एकस्काला से जावा तक क्लास ऑब्जेक्ट को कैसे पास किया जाए?

public class SimpleGraph<V, E> 
    extends AbstractBaseGraph<V, E> 
    implements UndirectedGraph<V, E> 
{ 
    public SimpleGraph(Class<? extends E> edgeClass) {...} 
} 
जावा से कॉल करने के लिए

है, मैं कहूंगा कि:

UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); 

सही स्काला बराबर क्या है?

अधिक विशेष रूप से, मैं डिज़ाइनर को DefaultEdge.class तर्क कैसे पास करूं?

उत्तर

18

बराबर स्काला कोड, है है के रूप में आप कहते हैं कि

val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge]) 

लेकिन वह थोड़ा Dryed क्योंकि स्काला अपने निर्माता के प्रकार के मापदंडों का अनुमान लगा सकते कर सकते हैं

val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge]) 

लेकिन यह डीआरवाई जितना नहीं हो सकता है। "DefaultEdge" प्रकार दो बार उल्लेख किया जाता है। आप प्रकटताओं के साथ और भी DRY प्राप्त कर सकते हैं। सबसे पहले आप सरलग्राफ बनाने के लिए एक कारखाना बनाते हैं।

object SimpleGraph { 
    import scala.reflect.Manifest 
    def apply[T, E]()(implicit mfst : Manifest[E]) = new SimpleGraph[T,E](mfst.erasure.asInstanceOf[Class[_ <: E]]) 
} 

और इस के साथ हम के साथ एक ग्राफ बना सकते हैं या तो

val g = SimpleGraph[String, DefaultEdge]() 

या

val g: UndirectedGraph[String, DefaultEdge] = SimpleGraph() 

जाहिर है यह तकनीक केवल इसके लायक है अगर आप SimpleGraphs का एक समूह बनाने के

अब कुछ चेतावनी और चेतावनियां। प्रकटताओं को अभी भी प्रयोगात्मक माना जाता है। मुझे संदेह है कि वे कभी भी गिराए जाने के लिए बहुत उपयोगी हैं, लेकिन इसकी कोई गारंटी नहीं है। प्रकटताओं के बारे में अधिक जानकारी के लिए http://scala-blogs.org/2008/10/manifests-reified-types.html

देखें
7

मुझे अपना जवाब मिला। बराबर

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge]) 
संबंधित मुद्दे