問題タブ [downcast]

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 投票する
1 に答える
4381 参照

java - Javaでオブジェクトをファイルにダウンキャストしようとしています

私は次のコードを書きました:

ご覧のとおり、私は FILE の ArrayList を持っています。次に、返される result.toArray と Object[] 配列を使用しますが、以前は File だったので、3 番目にしようとしているように File にダウンキャストできないのはなぜですかループ内の行?次のエラーが表示されます:

私のオプションは何ですか?

0 投票する
4 に答える
4146 参照

java - java: 新しいオブジェクトへの「ダウンキャスト」/スライスの反対

申し訳ありませんが、その質問の見出しを作成する方法が本当にわかりません。たぶん、私がやろうとしていることの名前がわからないかもしれませんが、いくつかのコードで説明できます:

残念ながら、copy-constructor も public static copy メソッドも持たないクラスがあるとします。

さらに推測すると、そのクラスのオブジェクトを返す関数がいくつかあります。

問題は、そのクラスから派生していくつかの機能を追加したいということです。残念ながら、Java には sizeof も、cc または静的コピー メソッドもありません。

だから私がするとき

次に、B のクローンを作成して新しい B を取得できますが、返された A を someFn() から B に変換するにはどうすればよいですか。Java でスライスの反対を行う方法はありますか? クローンを作成しても、それはまだ A であり、フィールドごとにコピーすることはできません。これは C++ ではすべて簡単ですが、Java ではどのように行うのでしょうか?

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

java - Java オブジェクトを拡張しようとするときにダウンキャストを回避する方法

外部 API の呼び出しからFoo型のオブジェクトをいくつか取得します。ローカルで、少し追加された情報でこれらのオブジェクトを処理したいので、これらの余分なフィールドを追加するサブクラスFooSonがあります。取得したすべてのオブジェクトを新しい継承された型に変換するにはどうすればよいですか? これらのオブジェクトは実際にはFooSonではないため、ダウンキャストはオプションではないようです。

私が思いついた唯一の解決策は、Fooオブジェクトを引数として取り、すべてのパブリック/保護された値を新しいFooSonオブジェクトにコピーして返す変換関数を作成することです。

欠点は次のとおりです。

  • 情報(私的価値)の喪失
  • Fooが変更された場合は、convert 関数を適応させる必要があります。

クラス Foo は、コピー コンストラクターまたはクローン オペレーターを実装しません。私は Foo のソース コードを持っていますが、将来のリリースとの互換性を維持するために変更を避けたいと考えています。それにもかかわらず、それが唯一の実行可能な代替手段である場合は、必要なものを取得するために Foo の実装を変更します。

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

c++ - Pointer to Base から Pointer to Derived への static_cast が「無効」なのはなぜですか?

だから私はこのコードを持っています:

mTree->getNode(groupID) は PCSNode* を返します。Node は PCSNode からパブリックに派生しています。

static_cast で見つけたすべてのドキュメントは、この効果について次のように述べています。「static_cast 演算子は、基本クラスへのポインターを派生クラスへのポインターに変換するなどの操作に使用できます。」

しかし、XCode の (GCC) コンパイラーは、 static_cast が PCSNode* から Node* へのものであることは無効であり、許可されていないと言っています。

これは何か理由がありますか?C スタイルのキャストに切り替えると、コンパイラからの苦情はありません。

ありがとう。

更新:質問には回答がありましたが、他の誰かが同じ問題を抱えている場合に備えて、完全を期すためにコンパイラ エラーを投稿します。

エラー: セマンティックの問題: 'PCSNode *' から 'Node *' への Static_cast は許可されていません

0 投票する
3 に答える
100 参照

oop - オブジェクト(キャストではない)のIDを変更できる言語はどれですか?

この投稿Baseでは、勇敢な人が(C ++で)型のオブジェクトを型にダウンキャストしたいと考えていますDerived。Derived型に。よりも多くの属性がないと仮定すると、クラスが提供する追加のメソッドに嫉妬している場合は意味がありBaseますDerived

そのようなことを可能にするプログラミング言語はありますか?

0 投票する
3 に答える
1489 参照

java - Java でこのオブジェクトをダウンキャストできないのはなぜですか?

私はこの方法を持っています:

署名は、メソッドMessageが私が作成したオブジェクトである を返すことを示しています。AddressMessage場合によっては、 を拡張する私の別のオブジェクトを返すことに注意してくださいMessage

私の問題-新しいものを返す場合AddressMessage(arguments)、後でAddressMessageオブジェクトにダウンキャストすることはできません[書き込み(AddressMessage) object]

0 投票する
3 に答える
1479 参照

c++ - ファクトリ パターンを使用する場合、ダウンキャストを避ける必要がありますか?

独自のプロトコルを実装するサーバー プロジェクトに取り組んでいます。サーバーは C++ のファクトリ パターンで実装されており、ダウンキャストの問題に直面しています。

私が取り組んでいるプロトコルは、RS485、ZigBee、狭帯域 PLC などの低速ネットワークを自動制御するように設計されています。工場のパターンでメイン サーバーを設計しました。新しいフレームが受信されると、まずそのフレームに関連付けられているデバイス タイプを識別し、ファクトリ メソッドを呼び出して新しい「パーサー」インスタンスを生成し、フレームをパーサー インスタンスにディスパッチします。

当社独自のプロトコルは純粋なバイナリで実装されており、必要なすべての情報がフレーム自体に記録されるため、基本インターフェイスを可能な限りシンプルに定義できます。また、ファクトリの自動登録アプローチを実装します (std::map 操作に関連する詳細なコードはここでは省略されています)。

このファクトリ パターンは非常にうまく機能し、新しいデバイス タイプを簡単に拡張できます。

しかし、最近では、同様の機能を提供する既存の制御システムとのインターフェースを試みています。ターゲット システムはかなり古く、ASCII ベースの AT コマンドのようなシリアル インターフェイスしか提供しません。PTY との通信の問題は解決できましたが、解決すべき問題はパーサーの実装です。

ターゲット システムのコマンド インターフェイスは非常に限られています。完全なコマンドを取得するには、最初にヘッダーをポーリングし、次にペイロードをポーリングして、2 回ポーリングする必要があります。これは私たちの実装の問題です。2 つのフレームをパーサー インスタンスに渡して動作させる必要があるためです。

つまり、派生クラスのメソッドを呼び出す必要があり、そのメソッドは基本クラスでは定義されていません。そして、ファクトリ パターンを使用して派生クラスのインスタンスを生成しています。

いくつかの選択肢があります。

  1. 2 つの文字列を 1 つに連結するだけでは機能しません。どちらの文字列にもデバイス固有の情報が含まれており、それらは個別に解析されます。このアプローチを採用する場合、文字列を連結する前に、パーサー インスタンスから「事前解析」を実行する必要があります。そして、それは良い考えだとは思いません。

  2. parser_factory::get_instance() のリターンを legacy_parser にダウンキャストします。

  3. legacy_parser から派生したクラスのみを含む別の独立したファクトリを作成します。

  4. instance_generator と parser_factory の定義を変更して、(legacy_parser*) も生成できるようにしますが、既存のコードはすべて影響を受けないようにします。

    /li>
  5. legacy_parser から派生したインスタンスを処理するために Visitor パターンで「スマート ポインター」を実装します。

    /li>

dynamic_cast<> によるダウンキャストが私たちにとって最も簡単なアプローチであることは明らかですが、何かをダウンキャストするのは「悪」だと誰もが感じているため、このアイデアを好む人はいません。しかし、なぜそれが「悪」なのかを正確に説明できる人はいません。

決定を下す前に、これらのオプションについてさらにコメントをお待ちしております。

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

java - Android Java クラスのキャスト

誰かが私のためにクラスキャストについて何か説明できるかどうか疑問に思っています.

私は Android で遊んでいて、ExApp という名前のアプリケーションのサブクラスがあります。

アクティビティの 1 つから ExApp のメソッドを呼び出したいので、次のようにします。

私が理解していないのは、なぜ二重の括弧が必要なのですか? なぜ私はできないのですか:

?

ありがとう。

0 投票する
4 に答える
4304 参照

objective-c - Objective-C の継承。親クラスから派生クラスへのダウンキャスト/コピー

私のプログラムには、クラスがありますClassA。派生クラスを作成したいと思いますClassB。私のプログラムには のインスタンスを返す関数がClassAあり、これらの戻り値を使用して のインスタンスを作成したい場合がありますClassB。単純なダウンキャストを行ってもコンパイラ エラーは発生しませんが、実行時エラーが発生します。これは、ポインターとオブジェクトのキャストに関する問題に関連しているようです。この場合に行うこと。

次に、C++ のコピー コンストラクターを模倣しようとしましたが、コピーされた変数がスコープ外に渡されたり、解放されたりして、再び実行時エラーが発生しました。

カテゴリの使用も検討しましたが、これは次の 2 つの理由から適切ではないようです。

  1. 何よりもまず、新しいクラス メンバーをカテゴリに追加することはできません。これができないと、少し複雑になります。
  2. カテゴリを介して追加されたメソッドは、クラスのすべてのインスタンスで使用できるようになります。厳密に言えば、これは問題ではありませんが、追加したいメソッドの特定の側面が一般的な設定で壊れる可能性があるため、私にはうまくいきません。つまり、これらのタイプのオブジェクトで何をする必要があるのか​​ 、何らかの形で特定されています。

私はまだObjective-Cを学んでいます。フォーラムに同様の質問がいくつかあることは知っていますが、答えはカテゴリにつながり、行き止まりまたは行き止まりになりましたが、あまり助けがなかったので、単純に再投稿する必要があると感じました.

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

java - HashSet の Iterator の問題

HashSet が次のプロジェクトのソリューションになるかどうかを確認しようとしているので、機能を確認するための非常に簡単なテストを行っています。私は単純なクラスを持っていますKlant:

構成を介したクラスは、HashSet

問題はメソッドtoon() にあります。基本的には、Iterator に Klant オブジェクトが含まれるように指定していますが、<Klant> ローカルオブジェクトでは 、オブジェクトはまだインスタンスであり、次のようにキャストしても、で 定義されたメソッドkが提供されません。getKlantNummer()KlantkObject

うまくいきません。ダウンキャスティングは危険ですが、私が覚えている限りでは禁止されていません。

何かアドバイス?