2011-07-17 4 views
5

두 가지 클래스 인 Guid 및 UserGuid가 있습니다. Guid에는 한 가지 형식 인수가 있습니다. UserGuid는 클래스가없는 엔티티 (User)를 나타내는 Guid의 특별한 경우이므로 Guid [Any]로 구현했습니다.스칼라의 일반 컴패니언 개체 수퍼 유형

Guid에는 두 가지 유형간에 공유하고 싶은 몇 가지 적용 메소드가 있으므로이를 수퍼 클래스 (GuidFactory)에 넣습니다. 그러나 Guid 매개 변수가 있기 때문에 GuidFactory 특성을 매개 변수화해야합니다. 그렇지 않으면 결과 Guid가 Guid [_]로 매개 변수화됩니다. 나는이 가이 드 및 UserGuid 또는 내가 그들을 복제하거나 캐스팅을 사용해야합니다 사이의 방법을 적용 공유 할 수있는 방법이 있나요

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

: 결과

, 내 동반자 객체 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

은'apply' 방법 'UserGuid'에 대한 감각. 예 : 'UserGuid.apply [String] ("")'리턴해야 할 것은 무엇입니까? 'GuidFactory'에 따르면'UserGuid [String]'유형은 존재하지 않습니다. 정확히 문제가있는 –

+0

입니다. UserGuid.apply ("1234")가 아닌 UserGuid.apply ("1234")가되고 싶습니다. GuidFactory는 Guid의 하위 유형이며 하나의 매개 변수를 갖는 I 유형의 매개 변수를 취하고 UserGuid는 Guid의 부속 유형이며 Any 매개 변수로 Any 매개 변수를 제공하므로 이해가 필요합니다. UserGuid가 있어야하므로 Any ... –

답변

2

를 해결할 : GuidFactory` 만들하지 않는 것 '에

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

아니요 Guid와는 다르다. 그렇지 않으면 타입이 안전한 id 클래스의 핵심을 놓치게된다. –