問題タブ [covariant]
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.
c++ - 共変の戻り値の型
$10.3/5
「オーバーライド関数の戻り値の型は、オーバーライドされた関数の戻り値の型と同じか、関数のクラスと共変でなければなりません。関数 D::f が関数 B::f をオーバーライドする場合、関数の戻り値の型は次の基準を満たす場合、共変です。
— どちらもクラスへのポインタまたはクラスへの参照です98)
— B::f の戻り値の型のクラスは、D::f の戻り値の型のクラスと同じクラスであるか、D::f の戻り値の型のクラスの明確でアクセス可能な直接または間接の基本クラスです。 :f
—ポインターまたは参照の両方が同じ cv 修飾を持ち、D::f の戻り値の型のクラス型の cv 修飾が、B::f の戻り値の型のクラス型と同じか、cv 修飾が少ない。
上記の実験的なコードを書いたところ、コモーのエラー/警告が矛盾していることがわかりました。9 行目の警告は、戻り値の型の cv 修飾子が無意味であることを示しているようです。そして、まさにこの理由が、コードの形式が正しくないことにつながります。
問題は、コモーが 9 行目で「警告」メッセージを出すのは正しいかということです。私はそれが実装で定義された動作であることを知っています.Comeauは単に親切にしようとしています. しかし、この場合、せいぜい紛らわしいです。
java - Java 5+ API が共変の戻り値の型を利用しないのはなぜですか?
Java 5 以降、共変の戻り値の型を持つことが許可されています。Java API がこれを利用しないのはなぜですか?
たとえばGraphics2D.create()
、Graphics2D
オブジェクトを返すためにオーバーライドされないのはなぜですか? すべての状況で下位互換性があるように思えます。
c# - C# の一般的な共変エラー
以下は私のコードです。 DateTime が Object に変更できない理由がわかりません。この問題を解決するアイデアはありますか?
java - 列挙型インスタンスのメソッドをオーバーライドするために機能しないJava共変リターン型?
このトピックに関する情報を見つけるためにGoogleでかなりの時間を費やしましたが、Java列挙型と共変リターン型の両方に関連する結果はほとんど存在しませんでした。
つまり、次のように、列挙型クラスでメソッドを定義し、インスタンスでそれをオーバーライドする列挙型メソッドで共変リターン型を使用することは可能ですか?
そして、次のように共分散を利用します。
この場合、コンパイラは私の列挙型定義で問題ありませんが、テストケースはコンパイルに失敗し、オブジェクトを整数(または文字列)に変換できないと言っています。どうやら、コンパイラはメソッドの基本定義のみを調べ、オーバーライドするメソッドは調べないようです。別の列挙型定義を使用して、基本メソッドを抽象化しましたが、それでも機能しませんでした。
コンパイルプロセス中に列挙型が変換されて機能しなくなるのは複雑なことだと思いますが、私だけが愚かなことをしているのではないことを確認したいと思います。
このテストケースは確かに非常に工夫されていることに注意してください。私の実際の列挙型では、この機能の方が便利です。必要に応じて投稿できます。
c++ - 仮想関数の戻り値の型の違い
仮想関数の戻り値の型は、基本クラスの型と同じか、共変でなければなりません。しかし、なぜこの制限があるのでしょうか?
java - 抽象クラスAのより良い解決策はありますか?
メソッドをオーバーライドして、取得するパラメーターをそのパラメーターのサブクラスに置き換えたいと思います。
リターンタイプの場合、メソッドシグネチャの一部ではなく、サブクラス(「共変リターンタイプ」と呼ばれる)に置き換えることができるため、問題はありません。引数の場合、署名の一部であるため、これは機能しません。
そこで、同じタイプのジェネリックパラメーターを使用するソリューションを考え出しました。
しかし、「パブリック抽象クラスA」というステートメントは私には奇妙に見えます。これを達成する他の方法はありますか?「共変パラメータタイプ」はありますか?:-)
java - java共変リターンタイプ
以下のコードが「1」を出力するのはなぜですか?
generics - Scala - 共変型階層のルート
次の Scala クラス:
Foo[Bar] をルートとする型階層を効果的に定義します。つまり、有効な Foo[X] はすべて Foo[Bar] 値または変数に割り当て可能になります。
FooBase はさらに上にあり、Foo ではないオブジェクトを暗示している可能性もあります。以下に問題を示します。
...また、FooBase は型 T を認識しないため、そのメンバーはそれを指定できず、特殊化するには Foo でこれらの定義をオーバーライドする必要があります。
この問題を回避する方法は他にもありますが、要点は明確です。
最後に、私の実際の質問は、次の階層のルートは何ですか:
繰り返しますが、FooBase については教えないでください。そうではないからです。はい、特に目的のために別のクラスを間に挿入することはできますが、上記のようにそれはまだ真の答えではありません。
Scala は単にFoo
(型パラメーターなしで) 好きではありません。Foo[_]
型パラメーター type の値を返すメソッドにアクセスすると、実際にはAny
ではなくになりFoo
ます。もちろん、Foo[Foo]
2 番目の型パラメーターも欠落しており、多くのレベルしか取得できないため、どちらもFoo[Foo[_]]
実行Foo[Foo[Foo[Foo[_]]]
できません。
答えはまったくありますか、それとも Scala はこれをサポートしていませんか?
前もって感謝します!
c# - 共変ジェネリック パラメーター
これを理解しようとしていますが、検索から適切な結果が得られませんでした。
C# 4 でできること
これはどう違うのですか
私が知っているのout
は、ジェネリック パラメーターを共変 (??) にすることだけです。誰かが部品の使用法を例で説明できますか<out T>
? また、クラスではなくインターフェイスとデリゲートにのみ適用されるのはなぜですか?
重複している場合は申し訳ありませんが、重複している場合は閉じてください。
java - インターフェイスの共変の戻り値の型がJavac経由でコンパイルされない
私は次の構造を持っています:
Javac は次のメッセージで失敗します。
しかし、Eclipse はそれをうまくコンパイルでき、私が見る限り、コンパイルする必要があります。
これは Eclipse コンパイルまたは javac のバグですか? または、javac をコンパイルするように説得する方法はありますか? 参考までに、私の javac オプションは次のようになります。