問題タブ [subtyping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java (または Kotlin) で「自己クラス」を表現できますか?
質問のタイトルは少しわかりにくいと思いますが、これ以上正確な言い方が見つかりません。
私が欲しいものを伝えるために、簡単なコード例が必要です。
私は持っている:
しかし、実際には、このコードもコンパイルされます (差分: 戻り値の型宣言を見てください)。
コード 2 を型エラーにしたい。たとえば、すべての 'サブクラス'メソッドが . の代わりに自分自身を返すよう
に強制したいとします。A
bla
A
私が望むものを表す偽のコードが存在する可能性があると思います:
Haskell の型クラスのように:
これは可能ですか?
scala - Scala には ML のような値の制限がありますか? そうでない場合、なぜですか?
質問に対する私の考えは次のとおりです。誰でも確認、否定、または詳しく説明できますか?
私は書いた:
Scala は共変
List[A]
を に割り当てられた GLB ⊤ と統合しません。割り当ての方向が重要な「二重統合」をサブタイプ化することList[Int]
で bcz は承知しています。したがって、またはからの代入を受け入れることができないNone
タイプOption[⊥]
(すなわちOption[Nothing]
)が必要Nil
です。そのため、値制限の問題は方向性のない統一に由来し、グローバルな二重統一は、上記にリンクされた最近の研究まで決定できないと考えられていました。List[Nothing]
Option[Int]
List[Int]
上記のコメントのコンテキストを表示することをお勧めします。
ML の値の制限により、特にカリー化された関数 (関数型プログラミングで重要) を部分的に適用する場合など、パラメトリック ポリモーフィズムを許可しない場合 (以前はまれであると考えられていましたが、より一般的である可能性があります) )、代替の型付けソリューションは、関数型プログラミングと命令型プログラミングの間の階層化を作成し、モジュラー抽象型のカプセル化を破るためです。Haskell には、類似の二重単形化制限があります。OCaml では制限が緩和されている場合があります。これらの詳細のいくつかについて詳しく説明しました。
編集:上記の引用で表現された私の最初の直感(サブタイプによって値の制限が取り除かれる可能性がある)は間違っています。回答 IMO は問題をよく説明しており、アレクセイ、アンドレアス、または私のものを含むセットのどれを選択するのが最良の回答であるかを判断できません。IMO それらはすべて価値があります。