Scala - 创建扩展密封抽象类的案例对象列表

时间:2017-01-09 00:10:53

标签: scala sealed companion-object

我正在尝试在随播对象中创建一个案例对象列表。所有对象都从密封的抽象类继承。但编译器对列表中的每个项目说“找不到:值CompositeSpectrum”等等。密封的类和case对象都编译得很好,就在我尝试在伴随对象中创建List时出错。

sealed abstract class Peculiarity(val abbreviation: String, val description: String) {
    case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum")
    case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present")
    case object ShellStar extends Peculiarity("sh", "shell star")
    case object Uncertainty extends Peculiarity(":", "uncertainty")
    case object VariableSpectralFeatures extends Peculiarity("var", "variable spectral features")
    case object WeakFeatures extends Peculiarity("wl", "weak features")
    case object VeryBroadAbsorptionFeatures extends Peculiarity("nn", "very broad absorption features")
    case object BroadAbsorptionFeatures extends Peculiarity("n", "broad absorption features")
    case object EmissionLinesPresent extends Peculiarity("e", "emission lines present")
    case object NIIIandHEIIEmission extends Peculiarity("f", "NIII and HeII emission (O stars)")
    case object EnhancedMetalFeatures extends Peculiarity("m", "enhanced metal features")
    case object OtherPeculiarity extends Peculiarity("p", "other peculiarity")
    case object VeryNarrowAbsorptionLines extends Peculiarity("s", "very narrow absorption lines")
}

object Peculiarity {
    val peculiarities = List[Peculiarity](
        CompositeSpectrum,
        NebularFeaturesPresent,
        ShellStar,
        Uncertainty,
        VariableSpectralFeatures,
        WeakFeatures,
        VeryBroadAbsorptionFeatures,
        BroadAbsorptionFeatures,
        EmissionLinesPresent,
        NIIIandHEIIEmission,
        EnhancedMetalFeatures,
        OtherPeculiarity,
        VeryNarrowAbsorptionLines)
}

2 个答案:

答案 0 :(得分:2)

因为这些对象不存在,除非它们是从Peculiarity类型的实例引用的,因为它们被声明为Peculiarity的内部对象。

val pec = new Peculiarity("","") {}
val peculiarities = List[Peculiarity](
  pec.CompositeSpectrum,
  pec.NebularFeaturesPresent,
  ...

但我怀疑你所追求的是什么,你可以将声明移到抽象类之外

  sealed abstract class Peculiarity(val abbreviation: String, val description: String)
  case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum")
  case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present")
  ...

然后你的声明就可以了。

答案 1 :(得分:1)

没有必要将case object嵌套在密封的抽象类中。

这为我编译。

sealed abstract class Peculiarity(val abbreviation: String, val description: String)
case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum")
case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present")
case object ShellStar extends Peculiarity("sh", "shell star")
case object Uncertainty extends Peculiarity(":", "uncertainty")
case object VariableSpectralFeatures extends Peculiarity("var", "variable spectral features")
case object WeakFeatures extends Peculiarity("wl", "weak features")
case object VeryBroadAbsorptionFeatures extends Peculiarity("nn", "very broad absorption features")
case object BroadAbsorptionFeatures extends Peculiarity("n", "broad absorption features")
case object EmissionLinesPresent extends Peculiarity("e", "emission lines present")
case object NIIIandHEIIEmission extends Peculiarity("f", "NIII and HeII emission (O stars)")
case object EnhancedMetalFeatures extends Peculiarity("m", "enhanced metal features")
case object OtherPeculiarity extends Peculiarity("p", "other peculiarity")
case object VeryNarrowAbsorptionLines extends Peculiarity("s", "very narrow absorption lines")

object Peculiarity {
  val peculiarities = List[Peculiarity](
      CompositeSpectrum,
      NebularFeaturesPresent,
      ShellStar,
      Uncertainty,
      VariableSpectralFeatures,
      WeakFeatures,
      VeryBroadAbsorptionFeatures,
      BroadAbsorptionFeatures,
      EmissionLinesPresent,
      NIIIandHEIIEmission,
      EnhancedMetalFeatures,
      OtherPeculiarity,
      VeryNarrowAbsorptionLines)
}