2011-07-27 10 views
6

में त्रुटियों को टाइप करें "टाइप तर्क टाइप पैरामीटर सीमाओं के अनुरूप नहीं हैं" निम्नलिखित कार्य क्यों नहीं करते?स्केल

scala> abstract class Foo[B<:Foo[B]] 
defined class Foo 

scala> class Goo[B<:Foo[B]](x: B) 
defined class Goo 

scala> trait Hoo[B<:Foo[B]] { self: B => new Goo(self) } 
<console>:9: error: inferred type arguments [Hoo[B] with B] do not conform to class Goo's type parameter bounds [B <: Foo[B]] 
     trait Hoo[B<:Foo[B]] { self: B => new Goo(self) } 
             ^

scala> trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) } 
<console>:9: error: inferred type arguments [Hoo[B]] do not conform to class Goo's type parameter bounds [B <: Foo[B]] 
     trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) } 
              ^

पहले प्रयास में, Hoo[B] with B <: Foo[B] नहीं है?

दूसरे प्रयास में, Hoo[B] <: Foo[B] नहीं है?

// "Foo" 
abstract class Record[PK, R <: Record[PK, R]] extends Equals { this: R => 
    implicit def view(x: String) = new DefinitionHelper(x, this) 
    ... 
} 
// "Hoo" 
class DefinitionHelper[R <: Record[_, R]](name: String, record: R) { 
    def TEXT = ... 
    ... 
} 

// now you can write: 
class MyRecord extends Record[Int, MyRecord] { 
    val myfield = "myfield".TEXT 
} 

ताकि एक लिख सकते हैं मैं, पाठ बुलाया BYTEA के साथ एक नया विस्तार विधि शुरू करने की कोशिश कर रहा हूँ:

इस समस्या को प्रेरित करने के लिए, वहाँ के साथ एक पुस्तकालय है

class MyRecord extends XRecord[Int, MyRecord] { 
    val myfield = "myfield".BYTEA // implicit active only inside this scope 
} 

मेरे प्रयास:

class XDefinitionHelper[R <: Record[_, R]](name: String, record: R) { 
    def BYTEA = ... 
} 

trait XRecord[PK, R <: Record[PK, R]] { self: R => 
    implicit def newView(x: String) = new XDefinitionHelper(x, self) 
} 

लेकिन यह ऊपर मेरे छोटे परीक्षण मामले के समान समस्याएं चलाता है।

उत्तर

2

पहले प्रयास में, आपके पास Hoo[B] with B <: Foo[B] है। लेकिन Goo[Hoo[B] with B] के लिए मौजूद है, आपको Hoo[B] with B <: Foo[Hoo[B] with B] की आवश्यकता है। इसी तरह दूसरे मामले में।

+0

धन्यवाद, मैं अब देखते हैं कि कैसे मेरी दूसरी ठीक करने के लिए प्रयास ('फू [हू [बी]]' का विस्तार करते हुए '), लेकिन कैसे पहला फॉर्म (स्वयं प्रकार का उपयोग करके) को ठीक करेगा? – Yang

+0

इसके अलावा इसे और भी परेशानी हो रही है। मुझे 'कक्षा Ioo [बी <: Ioo [B]] को परिभाषित करने की आवश्यकता है [बी] {नया गुओ (यह)}' लेकिन यह काम नहीं करता है। न ही 'हू [आईयू [बी]] 'बढ़ाता है। लेकिन 'कक्षा Ioo [बी <: फू [बी]] हू [बी] 'कार्यों को बढ़ाता है,' हू 'के भीतर से' आईयू 'के उदाहरण पर' गू 'को बुलाता है। फिर भी मैं इसे 'आईयू' के भीतर से नहीं कर सकता। – Yang

+0

उपर्युक्त वास्तव में होना चाहिए: मुझे 'कक्षा Ioo' को परिभाषित करने की आवश्यकता है [Ioo] {new Goo (this)} 'लेकिन यह काम नहीं करता है। न ही 'हू [फू [आईयू]] 'बढ़ाता है। – Yang

0

यह (यानी .: एक अच्छा अभ्यास के रूप में) सच होना भी आसान लगता है, लेकिन यह मेरा दिन वैसे भी बचाया है, इसलिए कि वह कहाँ है:

scala> trait MyTrait[T <: MyTrait[T]] { self: T => def hello = println("hello") } 

scala> case class User(t: MyTrait[_]) 
<console>:8: error: type arguments [_$1] do not conform to trait MyTrait's type parameter bounds [T <: MyTrait[T]] 
     case class User(t: MyTrait[_]) 

scala> case class User(t:() => MyTrait[_]) 
defined class User