generics - Scala 中的通用伴随对象父类(super class)型

标签 generics scala

我有两个类,Guid 和 UserGuid。 Guid 有一种类型参数。 UserGuid 是 Guid 的一个特例,表示没有类的实体(用户),所以我将它实现为 Guid[Any]。

我有几个适用于 Guid 的方法,我想在这两种类型之间共享它们,所以我将它们放在一个父类(super class) (GuidFactory) 中。然而,由于 Guid 是参数化的,我必须参数化 GuidFactory trait,否则生成的 Guid 将被参数化为 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)
}

最佳答案

这是我能建议的最好的:

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")

关于generics - Scala 中的通用伴随对象父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6724705/

相关文章:

scala - akka.io 在 2.3 中逐行接收

java - 将 Scala 嵌套 Map 转换为 Java 嵌套 util.Map

c# - 匿名函数与非匿名函数一样强大

java - 如何在java中获取ParameterizedType的通用容器类

scala - com.twitter.util.Await 不会引发 com.twitter.util.TimeoutException

scala - 无法初始化 Scala Gradle 项目 : -bash: gradle/gradle-5. 2.1/bin/gradle:没有这样的文件或目录

scala - 如何使用 Map[String,Long] 列作为 DataFrame 的头部并保留类型?

java - 数组列表中的泛型错误

ios - Swift 通用函数调用另一个通用函数

generics - VHDL:使用整数通用的长度来确定选择行的数量