問題タブ [upcasting]
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 - List オブジェクトをアップキャストする理由 Android / Java 構文
最近、理解を深めるために多くの Android プロジェクトのコードを読んでいます。私が目にすることの 1 つは、ArrayList がインスタンス化される 2 つの方法の違いです。
ここに示す 2 つの例に注意してください。なぜ一部の人は例 1 を使用し、なぜ例 2 よりもそれを使用するのですか?それらの主な違いは何ですか?
Java でのアップキャストとダウンキャストの概念を理解していますが、この特定の状況では何の利点もありません。arrayList を作成する場合は、最初から ArrayList 変数に格納しないでください。
新しい ArrayList を作成する例 2 の方法を常に使用してきました。例 1 に示されているものを使用する利点がわかりません
より多くのプログラマーが example 1 の方法を使用しているようです
例 1、親変数へのアップキャストの使用
例 2
c# - コンパイラは不要/冗長なアップキャストを最適化しますか、それとも IL をまったく生成しますか?
冗長なキャストは最適化されますか? コンパイラが不要なダウンキャスト (つまりcastclass
) を最適化していないことがわかります。しかし今、私はより単純なケースに興味があります。この質問は参照タイプのみに関係し、 には関係ありませんboxing
。
upcast
それはILを生成しないように思われるため、冗長な明示的なupcast
コストはまったくかかりませんか? upcast
または、IL 命令は型がないため、舞台裏で冗長な明示的なパフォーマンス コストが依然として存在しますか?
または、upcast は時々 IL 命令を生成しますか?
c++ - カスタムキャスト演算子を使用したテンプレートクラスへのアップキャスト
2 つのクラスから継承するクラスがあります。1 つは自分の基本クラスで、もう 1 つはテンプレート クラスです。
ある時点で、次のように基本クラス オブジェクトをホストからデバイスにコピーする割り当てを行う必要があります。
しかし、それを行う前に、これをその基本クラスcsr_matrixにアップキャストする必要があります
static_castとカスタムキャスト演算子を試しました:
ただし、実際に実行しようとすると、コンパイラから大量のエラーが発生します
実際、静的キャストもこの時点では理解できません。
それでも、typedef を使用しない C スタイルのショットガン キャストは機能するようです。
しかし、typedef で失敗します:
では、できれば静的キャストを使用して、独自のカスタム オペレーターを使用して安全にアップキャストするにはどうすればよいでしょうか?
完全な namespace::type でのキャストが機能するのに、typedef で失敗するのはなぜですか?
java - Java 6 でのダウンキャストのコストはどれくらいですか?
タイプの引数を受け取るメソッドがあり、その引数を処理するときに、クラスCollection
で見つかったいくつかのメソッドを使用する必要があります。List
アップキャストは速度の面で高価ですか?
また、collection
オブジェクトはこの後は使用されず、list
.
c++11 - 見返りにunique_ptrアップキャスト
さまざまな派生オブジェクトを生成し、次のように返すはずのこの関数がありますunique_ptr<base>
。
std::move を使用しても、これを実行する方法はありません。(dynamic_cast も使用しましたが、間違っていた可能性があります)。
これは私が得るエラーです: (gcc (GCC) 4.8.1 20130725 (プレリリース) on ArchLinux)
自分が何をしたいのかが明確になったことを願っています。
どうすればいいのですか?ありがとう。
c++ - ベース ポインターを介したベースの 1 つへの派生クラスのキャスト
編集:わかりましたが、これはケースを大きく変更するため、より正確なシナリオは次のとおりです。
私が現在持っている階層は、これに多少似ています。
オブジェクトをキャストして関数を呼び出そうとすると、Visual Studio でエラーが発生します。
派生を介した IBase インターフェイスのすべての呼び出しは正常に機能しますが、派生を IDerived にキャストしようとすると、関数呼び出しでエラーが発生します。
そのようなキャストは違法だと思いますが、IDerived インターフェイス メソッドにアクセスできるようにするにはどうすればポインターをキャストできますか (できれば、dynamic_cast がなければ、適切でポータブルなハックがあればそれを使用したいと思います ;))? 適切なvtableが使用され、すべてが正常に機能するように、ポインターへのオフセットを計算することは可能ですか?
私はかなり長い間プログラミングを行ってきましたが、大量のインターフェースとテンプレートを備えた設計されたシステムに対するこれらの空想を常に回避してきましたが、今では自分で作成する運命にあります。
編集:ご覧のとおり、これはトリッキーで困難になります。テンプレート化されているため、取得している Derived の正確なタイプはわかりません。関数 CreateDerived もテンプレート化されており、インターフェイスを返します。
また、要件の 1 つは、dynamic_cast を使用しないことです (プロジェクトでは RTTI が無効になっています)。
c# - アップキャスト/ダウンキャストとシリアル化
キャストで遊んでいるだけです。2つのクラスがあるとします
両方をインスタンス化する
では、アップキャストを試してみましょう
b2 は、Inh クラスでのみ表示されるフィールド b をまだ保持しているようです。ダウンキャストで確認してみましょう。
ここでチェックはtrueです(i2とi3が同じインスタンスi1を参照しているためだと思います)。わかりました、それらがどのように配列に格納されるか見てみましょう。
合計は 15 であるため、すべて問題ありません。しかし、XmlSerializer を使用して配列をシリアル化しようとすると (内容を確認するためだけに)、InvalidOperationException "The type ConsoleApplication1.Inh was not expected" が返されます。基地の配列なので、まあ、まあまあです。
では、実際の b2 とは何でしょうか? Bases と Inhs の配列をシリアル化できますか? 逆シリアル化された配列から項目をダウンキャストして Inhs フィールドを取得できますか?