2011-07-17 17 views
5

में जेनेरिक साथी ऑब्जेक्ट सुपरटेप मेरे पास दो कक्षाएं, मार्गदर्शिका और उपयोगकर्तागुइड हैं। ग्रिड में एक प्रकार का तर्क है। UserGuid Guid का एक विशेष मामला है जो एक इकाई (उपयोगकर्ता) का प्रतिनिधित्व करता है जिसके लिए कोई कक्षा नहीं है, इसलिए मैंने इसे एक GUID [Any] के रूप में लागू किया है।स्कैला

मेरे पास गुइड के लिए कई लागू विधियां हैं जिन्हें मैं दो प्रकारों के बीच साझा करना चाहता हूं, इसलिए मैंने उन्हें एक सुपरक्लास (GuidFactory) में रखा। हालांकि, चूंकि गइड पैरामीटरकृत है, इसलिए मुझे ग्रिड फैक्ट्री विशेषता को पैरामीटर करना है, अन्यथा परिणामस्वरूप गइड को guid [_] के रूप में पैरामीटर किया जाएगा।

नतीजतन, मेरे साथी वस्तु UserGuid संकलन नहीं करता है, कि शिकायत:

error: com.wixpress.framework.scala.UserGuid takes no type parameters, expected: one object UserGuid extends GuidFactory[UserGuid]

वहाँ किसी भी तरह से मैं Guid और UserGuid या मैं उन्हें नकल या कास्टिंग का उपयोग करना चाहिए के बीच विधियां लागू साझा कर सकते हैं है?

कोड इस प्रकार है।

abstract class TypeSafeId[I, T](val id: I) extends Serializable  
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Any](id) 

trait GuidFactory[I[A] <: Guid[A]] { 
    def apply[T](id: String): I[T] 
    def apply[T](id: UUID): I[T] = apply(id.toString) 
    def apply[T](ms: Long, ls: Long): I[T] = apply(new UUID(ms, ls)) 
    def apply[T](bytes: Array[Byte]):I[T] = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random[T] = apply[T](UUID.randomUUID()) 
} 

object Guid extends GuidFactory[Guid] { 
    override def apply[T](id: String) = new Guid[T](id) 
} 

object UserGuid extends GuidFactory[UserGuid] { 
    override def apply(id: String) = new UserGuid(id) 
} 
+0

'' GuidFactory' बनाने के लिए नहीं लग रहे में apply' तरीकों 'UserGuid' के लिए भावना। जैसे 'UserGuid.apply [स्ट्रिंग] (" ") 'वापसी' क्या होनी चाहिए? 'GuidFactory' के अनुसार, इसमें 'UserGuid [स्ट्रिंग]' टाइप होगा, जो मौजूद नहीं है। –

+0

जो वास्तव में समस्या है, मैं इसे UserGuid.apply ("1234") होना चाहता हूं, UserGuid.apply [स्ट्रिंग] ("1234") नहीं; जो समझ में आना चाहिए, चूंकि GuidFactory टाइप I का पैरामीटर लेता है, जो कि गुइड का उप-प्रकार है और इसमें एक पैरामीटर है, और UserGuid Guid का उप-प्रकार है और एक पैरामीटर को किसी भी के रूप में प्रदान करता है ... –

उत्तर

2

का समाधान होगा यह मेरा सुझाव कर सकते हैं सबसे अच्छा है:

import java.util.UUID 
abstract class TypeSafeId[I, T](val id: I) extends Serializable 
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Any](id) 

trait GuidFactory[G] { 
    def apply(id: String): G 
    def apply(id: UUID): G = apply(id.toString) 
    def apply(ms: Long, ls: Long): G = apply(new UUID(ms, ls)) 
    def apply(bytes: Array[Byte]): G = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random = apply(UUID.randomUUID()) 
} 

object Guid { 
    def apply[T] = new GuidFactory[Guid[T]] { 
    def apply(id: String) = new Guid[T](id) 
    } 
} 

object UserGuid extends GuidFactory[UserGuid] { 
    override def apply(id: String) = new UserGuid(id) 
} 

val guid1 = Guid[String]("123") 
1

इससे आपकी समस्या ?:

package guid 
import java.util.UUID 

abstract class TypeSafeId[I, T](val id: I) extends Serializable  
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Nothing](id) 

trait GuidFactory[I[A] <: Guid[A]] { 
    def apply[T](id: String): I[T] 
    def apply[T](id: UUID): I[T] = apply(id.toString) 
    def apply[T](ms: Long, ls: Long): I[T] = apply(new UUID(ms, ls)) 
    def apply[T](bytes: Array[Byte]):I[T] = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random[T] = apply[T](UUID.randomUUID()) 
} 

object Guid extends GuidFactory[Guid] { 
    override def apply[T](id: String) = new Guid[T](id) 
} 

//object UserGuid extends GuidFactory[UserGuid] { 
// override def apply(id: String) = new UserGuid(id) 
//} 

object Test { 
    val guid1 = Guid[String]("123") 
    val guid2 = Guid.random[List[Any]] 
    val userguid = Guid("123") 
    val userguid2 = Guid.random 
} 
+0

नहीं, चूंकि UserGuid होना आवश्यक है ग्रिड से अलग, अन्यथा यह एक प्रकार-सुरक्षित आईडी वर्ग के पूरे बिंदु को याद करता है ... –