代码之家  ›  专栏  ›  技术社区  ›  Jon Deaton

Scala泛型类型约束和专门化行为

  •  1
  • Jon Deaton  · 技术社区  · 6 年前

    我有一节课,我需要一个 apply[T] 方法where T Foo Bar . 此外,该方法需要根据其是否为 或者 酒吧 . 因为字型擦除,我不能简单地做 apply[Foo] apply[Bar] 方法(那是我第一次尝试)。为了解决这个问题,我试着这样做

    def apply[T](ds: Dataset[T]): Dataset[T] = { 
        ds match {
            case ds: Dataset[Foo] => ...
            case ds: Dataset[Bar] => ...
            case _ => ???
        }
    }
    

    但这不起作用,因为类型擦除 T型 . 而且这甚至不限制这个方法只能用 T型 类型

    2 回复  |  直到 6 年前
        1
  •  2
  •   Dima    6 年前

    下面是一个很好的类型擦除技巧:

    def apply(ds: Dataset[Foo]): Dataset[Foo] = ???
    def apply(ds: Dataset[Bar])(implicit dummy: DummyImplicit): Dataset[Bar] = ???
    

    允许您拥有具有相同运行时签名的多个方法,而不必使用类型参数。

        2
  •  0
  •   Joe K    6 年前

    可以使用隐式类型类:

    trait Baz[T] {
      def apply(ds: DataSet[T]): DataSet[T]
    }
    
    implicit val fooImpl = new Baz[Foo] {
      def apply(ds: DataSet[Foo]): DataSet[Foo] = ???
    }
    
    implicit val barImpl = new Baz[Bar] {
      def apply(ds: DataSet[Bar]): DataSet[Bar] = ???
    }
    
    def apply[T](ds: Dataset[T])(implicit b: Baz[T]): Dataset[T] = b(ds)