Feature
が間違っているときにscalacにエラーを表示させ、Service1
以外を変更することはできません。コンパイラはそのインターフェイスに基づいてService1.containsFeature
への呼び出しを受け入れるか拒否しますが、そのインターフェイスは既にService
に定義されており、のいずれかを受け入れます。 を受け入れます。
他のコードについて変更することができる場合は、いくつかの方法があります。たとえば、すべてを変更できる場合:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Service[Allowed <: Feature] {
def containsFeatures(x: Allowed*): Unit
}
object Service1 extends Service[S1Feature] {
def containsFeatures(x: S1Feature*): Unit = println("ok")
}
object Service2 extends Service[S2Feature] {
def containsFeatures(x: S2Feature*): Unit = println("ok")
}
sealed trait Feature
sealed trait S1Feature extends Feature
sealed trait S2Feature extends Feature
case object A extends S1Feature
case object B extends S2Feature
case object C extends S1Feature
case object D extends S2Feature
case object E extends S1Feature
case object F extends S2Feature
case object G extends S1Feature
// Exiting paste mode, now interpreting.
scala> Service1.containsFeatures(A,B,C)
<console>:16: error: type mismatch;
found : B.type
required: S1Feature
Service1.containsFeatures(A,B,C)
^
scala> Service1.containsFeatures(A,C,G)
ok
このようなことをしたいですか? Service1.containsFeature(List(A、C、E、G))// OK Service1.containsFeature(List(B、D、F))//エラーをスローする –
コンパイル時にエラーが表示されるはずです。右? –
はい、コンパイル時にエラーが発生しました。 – Adarsh