代码之家  ›  专栏  ›  技术社区  ›  Abhijit Sarkar

如何使用TypeTag创建泛型生成器?

  •  0
  • Abhijit Sarkar  · 技术社区  · 6 年前

    给定以下类型层次结构:

    sealed trait Edge[T]
    sealed trait WeightedEdge[T] extends Edge[T]
    sealed abstract class AbstractUndirectedEdge[T] extends Edge[T]
    case class UndirectedEdge[T](...) extends AbstractUndirectedEdge[T]
    case class UndirectedWeightedEdge[T](...) extends AbstractUndirectedEdge[T] with WeightedEdge[T]
    case class DirectedEdge[T](...) extends Edge[T]
    case class DirectedWeightedEdge[T](...) extends WeightedEdge[T]
    
    sealed abstract class GraphBuilder[V, E <: Edge[V]]
    sealed class UndirectedGraphBuilder[V, E <: AbstractUndirectedEdge[V]] extends GraphBuilder[V, E]
    sealed class DirectedGraphBuilder[V, E <: DirectedEdge[V]] extends GraphBuilder[V, E]
    

    我想创建一个生成器方法,动态地确定返回哪个具体的生成器实例。

    def newBuilder[V, E <: Edge[V]](implicit tag: TypeTag[E]): GraphBuilder[V, E] = {
      tag.tpe match {
        case x if x <:< typeOf[DirectedEdge[V]] => new DirectedGraphBuilder[V, E]()
        case _ => new UndirectedGraphBuilder[V, E]()
      }
    }
    

    上面的内容无法编译。

    错误:(119,29)没有可用于 DirectedEdge[V]案例x如果x<:<typeOf[DirectedEdge[V]]=>新建DirectedGraphBuilder[V,E]()

    错误:(119,29)没有足够的参数 方法类型:(隐式ttag: 反射.runtime.universe.TypeTag[directedge[V]])反射.runtime.universe。类型。 案例x如果x<:<typeOf[directedge[V]]=>new DirectedGraphBuilder[V,E]()

    1 回复  |  直到 6 年前
        1
  •  1
  •   muradm    6 年前

    首先,你需要提供 TypeTag 对于 V 也:

    def newBuilder[V, E <: Edge[V]](implicit tag: TypeTag[E], tag1: TypeTag[V]) = {
      tag.tpe match {
        case x if x <:< typeOf[DirectedEdge[V]] => new DirectedGraphBuilder[V, DirectedEdge[V]]()
        case _ => new UndirectedGraphBuilder[V, UndirectedEdge[V]]()
      }
    }
    

    那么修,又是什么类型的 Edge