Scala

2011-07-17 14 views
5

için genel tamamlayıcı nesne türü türü İki sınıfım var, Guid ve UserGuid. Guid'in bir türü argümanı var. UserGuid, sınıfın bulunmadığı bir varlığı (Kullanıcı) temsil eden özel bir Kılavuzdur, dolayısıyla bunu bir Rehber [Any] olarak uyguladım.Scala

İki tür arasında paylaşmak istediğim Guid için birkaç başvuru yöntemim var, bu yüzden onları bir süper sınıfı (GuidFactory) içine koydum. Bununla birlikte, Guid parametrelendirildiğinden, GuidFactory özelliğini parametrelemem gerekiyor, aksi halde sonuçtaki Guid Guid [_] olarak parametrelenecektir. Ben Guid ve UserGuid yoksa onları çoğaltmak veya çevrimi kullanmanız gerekir arasındaki yöntemlerini uygulamak paylaşabilirsiniz herhangi bir yolu var mı

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

: Sonuç olarak

, arkadaşım nesne UserGuid şikayet, derleme yapmaz?

Kod izler.

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

' başvurdular yöntemleri UserGuid için anlamı. Örneğin. UserGuid.apply [String] ("") 'ne olmalıdır? GuidFactory'ye göre, var olmayan "UserGuid [String]" türüne sahip olacaktı. –

+0

tam olarak sorun, UserGuid.apply ("1234") olmasını istiyorum, UserGuid.apply [String] ("1234"); GuidFactory GuidFactory bir Guid alt türü olan ve bir parametresi olan bir tip I parametresi aldığından ve mantıksal bir anlam taşıdığından, UserGuid Guid'in bir alt türüdür ve Any parametresi olarak bir parametre sağlar ... –

cevap

2

çözmek istiyorsunuz: GuidFactory` yapmak görünmüyor `in

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

bu Bu benim önerebilirsiniz en iyisi sorununuzu ?:

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

Hayır, UserGuid'in olması gerektiğinden Guid'den farklı olarak, aksi takdirde tür güvenli bir kimlik sınıfının tüm noktasını özlüyor ... –