問題タブ [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.

0 投票する
0 に答える
60 参照

scala - Scala ジェネリック型とサブタイピング

これは私の宿題の問題の 1 つで、私を完全に混乱させました。コンパイラがエラーを報告するかどうかを尋ねる質問。共変と反変が単一の型でどのように機能するかを理解しています。

これが問題の私の考えです。間違っている場合は修正してください。

この行は A と B の両方が型パラメーターの位置であり、反転する必要があり、B は B >: Dog[U,T,V] である必要がありますが、プログラムの他の部分については、何が起こっているのかわかりません。

0 投票する
5 に答える
325 参照

c# - C#サブクラスへの型キャストを避ける方法は?

Shape という基本クラスがあるとします。そして、circle や square などのいくつかのサブクラス。

次に、GetShape という別のクラスにメソッドを作成しましょう。

つまり、shapeType を渡して、厳密に型指定された Shape サブクラスを返すことができるということです。上記の例は、実際のコードを大幅に単純化したものですが、要点は合っていると思います。

このメソッドを呼び出すと、次のようになります

唯一の問題は、キャストが必要なため、実行すらできないことです。

これは実際に機能します:

私はそのキャストに夢中ではありません。どうすればそれを回避し、互換性のあるサブクラスを返すことができるように、メソッドが基本クラスを返すようにする方法を達成できますか。

0 投票する
1 に答える
1980 参照

java - 「クラス A がクラス B のサブクラスである場合、型 A は型 B のサブタイプでなければならない」と言えますか?

subtypeとの関係についてはある程度理解していsubclassますが、それが正しいかどうかはわかりません。

具体的なクラス (ジェネリック/高次クラスではない)

Java や Scala で具体的なクラスや型を宣言するとします。

classAが class のサブクラスである場合B、 typeは type ?Aのサブタイプでなければなりません。B

また、 typeAが type のサブタイプの場合B、 classAは class のサブクラスB? A(とBが両方のクラスであると仮定)

しかし、それらは具象クラスまたは型である場合にのみ真です

高次のクラス/型

しかし、高次の型の場合、これは当てはまりませんよね? 言う:

次に、 typeA[String]は type のサブタイプですA[Object]A[String]、 のサブクラスではありませんA[Object]よね?

0 投票する
1 に答える
68 参照

scala - 複数の特性を競合する抽象オーバーライドと混合する場合、どの実装が選択されるかをどのように予測できますか?

次の例を検討してください。

「HELLO, WORLD!」という出力に驚きました。出力が「hello, world!」ではないのはなぜですか。またはコンパイルエラー?

0 投票する
1 に答える
2302 参照

rust - Rust でのライフタイムのサブタイプ関係との闘い

Rust のドキュメントのマーカー セクションと、サブタイプバリアンスに関するウィキペディアの記事を何度も閲覧したのに、ライフタイムのサブタイプ関係の理解が深まらなかったことに、私はばかげているように感じます。

「Cat <: Animal」は「Cat は Animal のサブタイプである」を意味し、「S は T のサブタイプである」は「任意の用語 S を安全に使用できる」を意味する「典型的な OOP スタイル」のサブタイイング関係に慣れていると思います。タイプ T の項が期待されるコンテキストで使用されます。」ここまでは順調ですね。

しかし、これは生涯にどのように適用されるのでしょうか? 現在Rustで定義されている方法はどうやら(*)

(#1) 'a <: 'b <=> 寿命 a は寿命 b より長くありません。

と、「もちろんそういうことだ!」と思われるかもしれません。おそらく、<: がより小さい演算子に似ているため、または「サブ」がサブセットを考えさせ、短い寿命は確かに長い寿命のサブセットであるためです。しかし、'a が 'b より長くない場合、'a は本当に'bのサブタイプですか? ウィキペディアのサブタイプ関係の定義を適用してみましょう。

(#2) 'a <: 'b <=> ライフタイム a は、ライフタイム b が期待されるコンテキストで安全に使用できます。

私が抱えている問題は、これを調整できないことです。2位から1位になる方法は?私には、これは矛盾しているように思えます...何かが少なくともbの間生きていると予想し、bよりも短い寿命aを持つものがある場合、寿命bを持つものがあるコンテキストでは明らかにそれを使用できません必須ですよね?それは私だけですか、それともライフタイムのサブタイプ関係が間違っているのでしょうか?

#rust編集: (*) IRC チャネルの Ms2ger によると、これは事実です。また、反復子で使用される反変ライフタイム マーカーに関するドキュメントにも適合しItemsます。

Edit2: ContravariantLifetime および CovariantLifetime マーカーが削除されました。現在、マーカーモジュールPhantomDataの代替品として用意されています。

0 投票する
5 に答える
640 参照

java - JAVA: サブタイプと継承の概念は同じものですか?

この回答の最後にあるメモに基づくと、Java ではサブタイプと継承が微妙に異なる概念であるように見えます。それは何ですか?クラス宣言にextends ...句が含まれている場合にのみ継承されますか? この場合、クラスは Object のサブタイプであっても Object から継承されませんよね?