2014-04-09 9 views
7

में सार प्रकार का उपयोग मैं निम्नलिखित कोड है कहो। वर्ग Bar, उदाहरण के लिएस्ट्रक्चरल टाइपिंग:</p> <pre><code>class Bar { def bar(b:Bar):Boolean = true } def func(b:Bar) = b.bar(b) </code></pre> <p>ऊपर ठीक काम करता है: शोधन

class Foo { def bar(f:Foo):Boolean = false } 

इसके बजाय ऐसे प्रत्येक वर्ग के लिए func लेखन की एक 3 पार्टी पुस्तकालय में परिभाषित किया गया है और वहाँ कई समान कक्षाएं, एक bar विधि के साथ प्रत्येक रहे हैं, मैं सामान्य प्रकार B का उपयोग कर func परिभाषित करना चाहते हैं जब तक इसमें सही हस्ताक्षर की bar विधि है।

मैंने कोशिश की निम्नलिखित लेकिन यह मुझे एक त्रुटि देता है:

def func[B <: {def bar(a:B):Boolean}](b:B) = b.bar(b) // gives error 

त्रुटि मैं मिलता है:

<console>:16: error: Parameter type in structural refinement may not refer to 
an abstract type defined outside that refinement 
def func[B <: {def bar(a:B):Boolean}](b:B) = b.bar(b) 
        ^

हालांकि, अगर मैं निम्नलिखित, विधि परिभाषा काम करता है लेकिन ऐसा मंगलाचरण देता है एक त्रुटि:

def func[B <: {def bar(a:Any):Boolean}](b:B) = b.bar(b) 

func(new Bar) 

<console>:10: error: type mismatch; 
found : Bar 
required: B 
      func(new Bar) 
      ^

वहाँके कोड को बदले बिना मैं क्या चाहते करने के लिए कोई रास्ता नहीं है?

उत्तर

2

यह विधि पैरामीटर के लिए संरचनात्मक प्रकार के बाहर परिभाषित अमूर्त प्रकार के साथ समस्या को जानना है। दूसरा आपका दृष्टिकोण काम नहीं करता है क्योंकि विधि हस्ताक्षर बराबर नहीं है (विधि ओवरलोडिंग की तरह दिखता है)।

मैं वर्कअराउंड का उपयोग करने का प्रस्ताव करता हूं। विधि परिभाषा के कार्यात्मक दृष्टिकोण है, क्योंकि Function1 [-T1, + आर] में जाना जाता है के प्रकार:

class Bar { def bar : Bar => Boolean = _ => true } 
class Foo { def bar : Foo => Boolean = _ => false } 

def func[T <: { def bar : T => Boolean } ](b: T): Boolean = b.bar(b) 

func(new Bar) 
func(new Foo) 

विपक्ष & पेशेवरों कार्यात्मक प्रकार वी.एस. विधि प्रकार परिभाषा here

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

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