scala - 是否可以将泛型参数限制为父类(super class)型的子集?

标签 scala

在 Scala 中,我可以将泛型参数限制为父类(super class)型的子集吗?

sealed trait A
class X extends A
class Y extends A
class Z extends A

def myStrictFunc[T is X or Y, but not Z](o: T)
                 ----------+----------
                           |
                           Can I have this constraint in Scala ?

最佳答案

如果您需要从众多答案中排除一个,Dmytro Mitin 的答案是一个很好的答案。另一方面,如果您需要将包含范围限制为众多中的少数,那么这是一种方法。

sealed trait A {val id: Int}
class W extends A {val id = 13}
class X extends A {val id = 17}
class Y extends A {val id = 18}
class Z extends A {val id = 21}

trait Contra[-X]
type Union[A,B] = {
  type Check[Z] = Contra[Contra[Z]] <:< Contra[Contra[A] with Contra[B]]
}

def myStrictFunc[T <: A : Union[X,Y]#Check](t: T): Int = t.id

myStrictFunc(new X)  //res0: Int = 17
myStrictFunc(new Y)  //res1: Int = 18
myStrictFunc(new Z)  //won't compile
myStrictFunc(new W)  //won't compile

Union 类型可以扩展到 3、4 或更多类型,但代码有点冗长。

关于scala - 是否可以将泛型参数限制为父类(super class)型的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728162/

相关文章:

scala - (不是)Scala 编译器错误? (空指针异常)

scala - 运行 Spark Streaming 作业时出现序列化问题

scala - 在 Intellij 中编辑 Build.scala

scala - 如何在scala中使用flink折叠功能

java - 凭经验估计大时间效率

scala - Scala 中的匹配 - 性能?

scala - 有没有一种方法可以在build.sbt中定义所需的sbt版本?

Scala 隐式参数作用域

arrays - 如何从 Scala 列表或数组中随机采样?

scala - FSC 每次都重新编译