Общий супертип объекта-компаньона в Scala - PullRequest
5 голосов
/ 17 июля 2011

У меня есть два класса, Guid и UserGuid.Guid имеет один тип аргумента.UserGuid - это особый случай Guid, который представляет сущность (пользователя), для которой нет класса, поэтому я реализовал его как Guid [Any].

У меня есть несколько методов применения для Guid, которые я хотел бы разделить между двумя типами, поэтому я поместил их в суперкласс (GuidFactory).Однако, поскольку Guid параметризован, я должен параметризовать черту GuidFactory, иначе результирующий Guid будет параметризован как Guid [_].

В результате мой сопутствующий объект UserGuid не компилируется, жалуясь на следующее:*

ошибка: com.wixpress.framework.scala.UserGuid не принимает параметров типа, как ожидается: один объект UserGuid расширяет 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)
}

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Это лучшее, что я могу предложить:

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 голос
/ 17 июля 2011

Решит ли это вашу проблему?:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...