首页 > 解决方案 > Scala 泛型类型约束和特殊行为

问题描述

我有一个类,我需要一个apply[T]方法,其中T只允许使用Fooor Bar。此外,该方法需要根据它是 aFoo还是 a来表现不同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. 此外,这甚至不会将此方法限制为只能使用 or 类型调用,当T它不是这两种类型之一时,它只是“什么都不做”。如何使此应用方法具有这些属性?FooBar

谢谢你。

标签: scalaapache-sparkgenerics

解决方案


这是一个关于类型擦除的好技巧:

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

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


推荐阅读