2011-07-15 18 views
8

मुझे स्कैला के प्रकार सीमा प्रणाली को समझने में कुछ परेशानी हो रही है।स्कैला प्रकार पैरामीटर सीमा

class HasIterable[T <: Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

val hello = new HasIterable("hello") 

वर्ग ही सफलतापूर्वक संकलित लेकिन बनाने के प्रयास: मुझे क्या करना कोशिश कर रहा हूँ एक धारक वर्ग कि प्रकार टी के आइटम है कि प्रकार ए के आइटम से अधिक पुनरावृति कर सकते हैं क्या मैं अब तक किया है रखती है बनाना है

<console>:11: error: inferred type arguments [java.lang.String,Nothing] do 
not conform to class HasIterable's type parameter bounds [T <: Iterable[A],A] 
    val hello = new HasIterable("hello") 
      ^

मुझे लगता है कि मामले में एक HasIterable[String, Char] के रूप में हल करने hello अपेक्षा की होगी: hello मूल्य मुझे इस त्रुटि देता है। यह समस्या कैसे हल हो जाती है?

उत्तर

17

String ही Iterable[Char] की एक उप प्रकार नहीं है, लेकिन इसकी pimp, WrappedString, है। आदेश अपनी परिभाषा निहित रूपांतरण का उपयोग करने की अनुमति देने के लिए, आपको एक view bound (<%) एक upper type bound (<:) के बजाय का उपयोग करने की जरूरत है:

class HasIterable[T <% Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

अब आप अपने उदाहरण से काम करेगा:

scala> val hello = new HasIterable("hello")    
hello: HasIterable[java.lang.String,Char] = [email protected] 
+1

होगा आप समझते हैं कि यह क्यों काम करता है (और दूसरा नहीं)? – dhg

+0

यह मेरे लिए काम किया, धन्यवाद! और हाँ, इस मामले में <% क्यों काम करता है? --हाहा मैं आपका संपादन देखता हूं। धन्यवाद :) – Dylan

+0

@ पेलोटॉम: महान स्पष्टीकरण। धन्यवाद! – dhg

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