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



我正在尝试在配套对象中创建案例对象列表。这些对象都继承自密封的抽象类。但是编译器对列表中的每个项目都说"未找到:值复合光谱"等。密封的类和 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)
}

因为这些对象不存在,除非它们从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")
  ...

然后你的声明就会很好。

没有必要将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)
}

最新更新