Scala通用类型约束和特殊行为

时间:2018-09-10 23:46:30

标签: scala apache-spark generics

我有一堂课,我需要一个import pyautogui pyautogui.click() 方法,其中只能将apply[T]T用作Foo。另外,该方法需要根据BarFoo的不同来执行不同的操作。由于类型擦除,我无法简单地制作Barapply[Foo]方法(这是我的第一次尝试)。为了解决这个问题,我尝试做类似的事情

apply[Bar]

,但是由于def apply[T](ds: Dataset[T]): Dataset[T] = { ds match { case ds: Dataset[Foo] => ... case ds: Dataset[Bar] => ... case _ => ??? } } 的类型擦除而无法使用。同样,这甚至不限制只能使用类型TT的{​​{1}}来调用此方法,当它不属于以下任何一种时,它只会“不执行任何操作”这两种类型。如何使此套用方法具有这些属性?

谢谢。

2 个答案:

答案 0 :(得分:2)

关于类型擦除,这是一个不错的技巧:

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

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

答案 1 :(得分:0)

您可以使用隐式类型类:

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)