泛型 – Scala中的通用伴随对象超类型
发布时间:2020-12-16 18:35:05 所属栏目:安全 来源:网络整理
导读:我有两个班,Guid和UserGuid. Guid有一个类型参数. UserGuid是Guid的一个特例,代表一个没有类的实体(User),所以我把它实现为Guid [Any]. 我有几种Guid的应用方法,我想在两种类型之间共享,所以我将它们放在一个超类(GuidFactory)中.但是,由于Guid是参数化的,我
我有两个班,Guid和UserGuid. Guid有一个类型参数. UserGuid是Guid的一个特例,代表一个没有类的实体(User),所以我把它实现为Guid [Any].
我有几种Guid的应用方法,我想在两种类型之间共享,所以我将它们放在一个超类(GuidFactory)中.但是,由于Guid是参数化的,我必须参数化GuidFactory特征,否则生成的Guid将被参数化为Guid [_]. 因此,我的伴随对象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) } 解决方法
这是我能建议的最好的:
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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |