scala - 在 Scala 中应该只接受 A 或 B 或 C 实例的方法

标签 scala types

我会确保方法只接受 ABC 的实例。而且我不想修改ABC的代码。

case class A
case class B
case class C
def method(aOrbOrc: Any) = ???

// method("toto") should not compile

最佳答案

你可以使用类型类。

case class A(s: String)
case class B(i: Int)
case class C(i1: Int, i2: Int)

// Type Class
trait ABC[T] { 
    def bar(t: T): String
}
// Instances
implicit object ABC_A extends ABC[A] {
    override def bar(t: A): String = "A : s = " + t.s
}
implicit object ABC_B extends ABC[B] {
    override def bar(t: B): String = "B : i = " + t.i
}
implicit object ABC_C extends ABC[C] {
    override def bar(t: C): String = "C : i1 = " + t.i1 + ", i2 = " + t.i2
}

def method[T](abc: T)(implicit instance: ABC[T]) = println(instance.bar(abc))

method(A("AAAAA")) // => A : s = AAAAA
method(B(123))     // => B : i = 123
method(C(9, 5))    // => C : i1 = 9, i2 = 5
method(1)          // compilation error

关于scala - 在 Scala 中应该只接受 A 或 B 或 C 实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982724/

相关文章:

exception - 我的持久性类应该返回 Option 还是依赖异常?

scala - 为什么 Scala 没有 decltype?

types - 是否可以匹配 Option<Vec<T>>?

java - 如何使用缓冲读取器和异常处理对输入数据类型进行分类?

如果一种编程语言具有数据类型但没有运算符重载,它还能被称为 "typed"吗?

string - 定位字符的下一次出现 ===>(发现 Unit 需要 boolean 值,错误)

scala - 如何将 java Map 转换为 LinkedHashMap[String,ArrayList[String]] 类型的 scala Map?

scala - Scala 中 scan 和 scanLeft 的区别

c# - 无法从 'object' 转换为 'decimal'

arrays - typescript :数组类型取决于先前的数组元素