問題タブ [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タイピング階層は正しいですか?
タイプ、、、、、、、およびを考えると、私List<?>
はそれらの階層を理解しようとしています。List<Object>
List<? super Number>
List<Number>
List<Integer>
List<? extends Number>
確かにのサブタイプですが、それはのList<Integer>
サブタイプではないことを私は知っているので、代わりにのサブタイプだと思いました。List<Number>
Integer
Number
List<? extends Number>
しかし、List<? extends Number>
直感的にはのサブタイプのように見えますList<Number>
。これは、私の考えが示すように、結局のところList<Integer>
子孫になります。List<Number>
それで、タイプが別のタイプから派生しているが、直接ではない場合、それはまだその祖先のサブタイプですか(または私は図で間違っています)?この演習では、?
対について少し混乱しました...実際には、私が持っていて混乱しObject
ているように見えます。最大の質問の1つは、「「すべて」は...またはすべては?」ということだと思います。または両方...またはどちらでもない?List<Object>
List<? super Number>
Object
?
java - 「?extendsE」と「TextendsE」の違いは何ですか?
私はJavaを初めて使用し、Java Generics and Collectionsの本から以下の奇妙な構文を理解しようとしています。(私はC ++テンプレートを幅広く使用したため、ジェネリックプログラミングの基本と考えられる落とし穴を理解していると主張できます)。
上記を次のように記述できないのはなぜですか。
違いはなんですか?それは単なる言語制限ですか、それとも内部で何か違いがありますか?
c++ - 例外処理と強制
出力:
サブタイピングでは例外処理がうまくいくのに、強制ではうまくいかないのはなぜですか?
ocaml - OCaml がレコードのサブタイプをサポートしないのはなぜですか?
「型とプログラミング言語」を読んで、クロージャーとレコードのサブタイピングを使用したオブジェクトの実装に感銘を受けました (第 18 章)。OCaml がレコードのサブタイピングをサポートしていない特別な理由はありますか (オブジェクトがサポートしていることは知っています)? 実際、これをサポートする言語は見つかりません。
c# - C# のジェネリック インターフェイス間のサブタイプ
いくつかのデータを含み、最小状態の別のインスタンスを生成できる「最小状態」タイプがあります。
また、より多くのデータを含み、通常状態のインスタンスを生成できる「通常状態」もあります。
私が知る限り、IState は IMinimalState のサブタイプである必要があります。(IMinimalState を必要とするものはすべて、IState を取得したときに同じように満足するはずです) ただし、コンパイラにそれを受け入れさせることはできません。
例:
では、ジェネリック インターフェイスを試してみましょう。
コンパイラ エラーはまだありません。しかしState
はまだ のサブタイプでMinimalState
はIState<State>
なく、 のサブタイプでもありませんIMinimalState<MinimalState>
。他の多くの組み合わせを試しましたが、成功しませんでした。
IState
のサブタイプを作成する方法はありIMinimalState
ますか? そうでない場合は、
.Net 型システムが十分に強力ではないためですか?
IState
または、それが本当にのサブタイプであると考えるのは間違っていますIMinimalState
か?IMinimalState
(必要なものがを受け取った場合にプログラムがクラッシュするシナリオはありIState
ますか?)
ocaml - なぜOCamlはポリモーフィックバリアントにサブタイピングを使用するのですか?
行ポリモーフィズムと、それを拡張可能なレコードとポリモーフィック バリアントに使用する方法について読みました。
ただし、Ocaml は多相バリアントのサブタイピングを使用します。なんで?行ポリモーフィズムよりも強力ですか?
java - ジェネリック定義内の生の型
次の一般的な定義がコンパイラの警告を生成しないのはなぜでしょうか。
上記の定義がどのように異なるか
ジェネリックについて読むときはいつでも、生の型をどのように避けるべきかについて読んでいます。その結果、ジェネリック型を扱うときはいつでも、コンパイラの警告が表示されます。ただし、最初の定義内の生の型は、そのような警告を作成しません。
次に、未加工の型とジェネリック型の間の正確なサブタイプ定義はどのようになっているのだろうかと思います。この要約によると、生の型は一種の型チェックの「オプトアウト」であるため、生の型が関係するときは常に型チェックが単に非アクティブになります。この仮定は正しいですか?そして、これは上記の「生の」一般的な定義にどのように影響しますか?
ご協力ありがとうございました!
更新:あなたの言っていることは理解しています。しかし、これは私が混乱しているものではありません。このシナリオを見てください:
一般的な制約のため、 to からの最初の呼び出しは許可されませcallWildcard1
ん。callBound1
ただし、2 番目は許可されます。「内部の生の型」なしで最初の呼び出しを実行するにはどうすればよいですか? コンパイラが最初のものを禁止する理由がわかりません。パラメータ有効なワイルドカード パラメータが意味するものはあり? extends MyClass<?>
ませんか?
更新 2 :試行錯誤の結果、次のように定義することで問題を解決できることがわかりました。
理由はよくわかりませんが。しかし、この例を見ると、さらに混乱があります: (これは、私が実際にやろうとしていることの非常に単純なバージョンです。)
なぜgenericCall1
禁止されてgenericCall2
いないのですか?繰り返しますが、私は真の理解ではなく、学術的な推測によって解決策を見つけました。ときどき、Java とそのジェネリックを扱っていると、泣きたくなることがあります...
c# - ポインター型がオブジェクトのサブタイプではないのはなぜですか?
object
言語設計者がポインター型を(参照型や値型とは異なり)サブタイプにしないことを選択したのはなぜですか? またはカスタムクラスを使用IntPtr
せずにポインターをボックス化する方法はありますか?UIntPtr
scala - 型メンバーとサブタイピングによる型キャストを避ける
パス依存型とパターン マッチングに問題があります。
scalac が と識別されないため、これは失敗foo
しb
ます。その結果、次の 2 つのキャストでのみ機能します。
確かに、キャストを回避するためのクリーンな方法が必要ですか?
java - 生の型とサブタイピング
次のコードを検討してください。
「生の型とは何か、それを使用すべきではない理由は?」のトピックを読みました。したがって、パラメータ化された型がある場合、生の型の定義により、コンパイル時に生の型へのMyClass<T>
参照を定義できます。MyClass m
さらにMyClass
、指定されたパラメータ化された型に対応する生の型は、すべての特定の型の型消去前のコンパイル時MyClass<T>
のスーパークラスです。この理由は正しいですか?MyClass<E>
E