我有一堂课,我需要一个import pyautogui
pyautogui.click()
方法,其中只能将apply[T]
或T
用作Foo
。另外,该方法需要根据Bar
或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
的{{1}}来调用此方法,当它不属于以下任何一种时,它只会“不执行任何操作”这两种类型。如何使此套用方法具有这些属性?
谢谢。
答案 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)