タグ付けされた質問 「type-casting」

7
PHPでの変数の型キャスト、これを行う実際的な理由は何ですか?
私たちのほとんどが知っているように、PHPには弱い型付けがあります。そうでない人のために、PHP.netは次のように述べています。 PHPは、変数宣言で明示的な型定義を必要としません(またはサポートしません)。変数のタイプは、変数が使用されるコンテキストによって決まります。 好きでも嫌いでも、PHPはその場で変数を再キャストします。したがって、次のコードは有効です。 $var = "10"; $value = 10 + $var; var_dump($value); // int(20) PHPでは、次のように変数を明示的にキャストすることもできます。 $var = "10"; $value = 10 + $var; $value = (string)$value; var_dump($value); // string(2) "20" それはすべてクールです...しかし、私の人生にとって、これを行うための実用的な理由を考えることはできません。 Javaのような、それをサポートする言語での強い型付けの問題はありません。それは大丈夫で、私はそれを完全に理解しています。また、関数パラメーターの型ヒントを認識し、その有用性を完全に理解しています。 型キャストに関する問題は、上記の引用文で説明されています。PHPで型を自由に交換できる場合は、型を強制的にキャストした後でも可能です。また、操作で特定のタイプが必要な場合にオンザフライで実行できます。これにより、次のことが有効になります。 $var = "10"; $value = (int)$var; $value = $value . ' TaDa!'; var_dump($value); // string(8) "10 TaDa!" …

10
サブクラスのAPIを汚染する場合でも、自分自身をキャストするオブジェクトを使用しても大丈夫ですか?
基本クラスがありBaseます。2つのサブクラスとがSub1ありSub2ます。各サブクラスにはいくつかの追加メソッドがあります。たとえば、Sub1has Sandwich makeASandwich(Ingredients... ingredients)、およびSub2has boolean contactAliens(Frequency onFrequency)。 これらのメソッドは異なるパラメーターを取り、まったく異なることを行うため、完全に互換性がなく、この問題を解決するためにポリモーフィズムを使用することはできません。 Baseほとんどの機能を提供し、Baseオブジェクトの大規模なコレクションを持っています。ただし、すべてのBaseオブジェクトはa Sub1またはaのいずれかSub2であり、時にはそれらがどれであるかを知る必要があります。 次のことを行うのは悪い考えのようです。 for (Base base : bases) { if (base instanceof Sub1) { ((Sub1) base).makeASandwich(getRandomIngredients()); // ... etc. } else { // must be Sub2 ((Sub2) base).contactAliens(getFrequency()); // ... etc. } } そこで、キャストせずにこれを回避する戦略を思いつきました。 Base現在、これらのメソッドがあります: boolean isSub1(); Sub1 asSub1(); Sub2 asSub2(); そしてもちろん、Sub1これらのメソッドを次のように実装します …

5
明示的なキャスト演算子の使用は合理的ですか、それとも悪いハックですか?
私には大きなオブジェクトがあります: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } そして、特殊なDTOのよ​​うなオブジェクト: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 個人的には、BigObjectをSmallObjectに明示的にキャストするという概念を見つけます-それは一方向のデータ損失操作であることを知っている-非常に直感的で読みやすいです: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 明示的な演算子を使用して実装されます: public static explicit operator …


4
キャストとはどういう意味ですか?
CIのような低レベル言語でコーディングする場合、キャストは「これらのバイトを常に他のタイプであるかのように再解釈する」こともあれば、「この値を他のタイプにインテリジェントに変換すること」を意味することもあります。 単語の本来の意味は何ですか?また、いつ変換を期待するか、いつ生の再解釈を期待するかについて一貫性はありますか?

6
ダウンキャストを避ける方法
私の質問は、スーパークラスの動物の特別なケースについてです。 私のAnimal缶moveForward()とeat()。 Seal拡張しAnimalます。 Dog拡張しAnimalます。 そしてまた延びている特別な生き物がありますAnimalと呼ばれるがHuman。 Humanメソッドもspeak()実装しAnimalます(では実装されません)。 受け入れる抽象メソッドの実装では、メソッドAnimalを使用したいと思いspeak()ます。それはダウンキャストをしなければ不可能だと思われます。ジェレミー・ミラーは彼の記事で、ひどい臭いがすることを書いた。 この状況でダウンキャストを回避するための解決策は何ですか?

3
コードで抑制警告を使用することは良い習慣ですか?
私は@SuppressWarnings("unchecked")、@SuppressWarnings("null")ほとんどの場合上記の方法を使用して、警告なしでコードをコンパイルできるようにしていますが、疑問があります。このStackoverflowの質問が見つかりました。ジョン・スキートが興味深い答えを書いてくれました。 彼によると、 時々、Javaジェネリックスはあなたがやりたいことをさせないだけで、あなたがしていることが本当に実行時に合法であることをコンパイラに効果的に伝える必要があります。 しかし、例外がスローされる可能性がある場合はどうでしょうか?警告を抑制するのは悪い考えではありませんか?問題が表面化する可能性のある場所を意識する必要はありませんか? また、誰かが後で私のコードを変更し、SuppressWarningsを削除せずに疑わしい機能を追加した場合はどうなりますか?それをどのように回避できますか、および/またはこれに他の代替手段はありますか? 私が使用してしなければならない@SuppressWarnings("unchecked")と@SuppressWarnings("null")? アップデート#1 未チェックの型キャストに関する限り、この回答(以下のコメントで@gnatが指摘)によると、これらの警告を抑制することが必要です。 安全でない型キャストの必要性を排除するために、多くの不可欠なJavaライブラリが更新されたことはありません。これらの警告を抑制することは、他のより重要な警告に気づき修正するために必要です。 他の警告を抑制する場合は、まだ少し灰色の領域にあります。 アップデート#2 あたりとして、Oracleのドキュメント(以下もいくつかの回答で述べました): スタイルの問題として、プログラマーは常に、このアノテーションが最も効果的な場所で最も深くネストされた要素に使用する必要があります。特定のメソッドで警告を抑制したい場合は、クラスではなくそのメソッドに注釈を付ける必要があります。

2
dynamic_castの使用を回避するための適切な設計?
いくつかの調査を行った後、私が頻繁に遭遇する問題を解決する簡単な例を見つけることができないようです。 Squares、Circles、およびその他の形状を作成し、画面に表示し、それらを選択した後でそれらのプロパティを変更して、すべての周囲を計算できる小さなアプリケーションを作成したいとします。 私はこのようなモデルクラスを行います: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} ~Square(); void setWidth(float w){m_width = w;} …

4
OOD:Java継承とキャストによる子メソッドへのアクセス
私はいくつかのクラス持っているParentとしChild1... Child9Javaで実装されています。Parent抽象クラスであり、子クラスのすべての共通変数(多くのParent場合、インターフェースではなく抽象クラスを作成した主な理由です)、いくつかの抽象メソッド、およびいくつかの実装されたメソッドを含みます。 一部の子クラスには、それらに固有のカスタムメソッドがあります。ダウンキャストを使用して子メソッドを呼び出すことがよくあります。 Parent p = new Child1(); ((Child1) p).child1SpecificMethod(); どういうわけか、これはOODの悪い習慣だと感じていますが、それが本当にデザインの改善方法であるかどうかはよくわかりません。 -編集- とにかく変更する必要があるのは、多くの(今のところ)共通変数を整理するためにParentクラスを使用し、それらを具象クラスのメンバー(またはコンテナーオブジェクト)にすることです。

3
命令型プログラミング言語での型のキャストと変換に違いはありますか?
StackOverflow での議論で問題が浮上しました。 (オブジェクトのタイプに関して)キャストと変換の 2つの概念の間に明確な違いはありますか、それともこれら2つの単語はまったく同じですか?C ++、Python、Java以外の言語はどうですか?EDIT:どのような問題の種類は次のように、プリミティブ型であるかintにfloat?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.