なぜこれは機能しませんか? Scalaは、case HasInts
の場合には、outer.type <: HasInts.type
を理解する必要があります。回避策(型メンバーを削除せずに)は何ですか?パターンマッチングと実在型
sealed trait Outer {
type Inner
}
case object HasInts extends Outer {
override type Inner = Int
}
def id(outer: Outer): outer.Inner =
outer match {
case HasInts => 0
}
編集:私たちは実存からユニバーサルへの型のメンバを変更した場合otherhandで
、それがコンパイルされます。
sealed trait Outer[Inner]
case object HasInts extends Outer[Int]
def id[I](outer: Outer[I]): I =
outer match {
case HasInts => 0
}
なぜそれが最初のケースではなく第二に働くだろうか?彼らは間違いなく同一です(実際にはDottyになります)。
「外」という2つの定義には基本的な違いはありません。実際には同等です。あなたは 'id'の定義を' def id [I](外側:外側{type Inner = I}):I = ... 'と書くことができました。型フィールドは、実在型を意味するものではありません。 – jpcooper