0

常にキャストを使用するケースはほとんどありませんが、実際にキャストを回避できるかどうかを知りたいですか?

1. sf からのインターフェースを検討する - org.springframework.validation.Validator

このインターフェースを実装すると、次のメソッドが得られます。

public void validate(Object event, Errors arg1) {

        Event e = (Event) event;

    }

このスレッドに触発され、IDE が私に提案するたびに自分がキャストを行うことを本当に心配していたことはありませんでした。そして、それが実際に例外をキャストする結果になったケースはほとんどありません.なぜキャストできないのか、そしてそれに対して何をすべきかを理解することはロケット科学ではありません. さらに、他の開発者が気付くオブジェクトの種類を正確にコメントすることができます。

仮に、サード パーティ ライブラリ インターフェイスの実装が常に Object パラメータになる場合、そのスレッドでの大騒ぎは何ですか? 明らかに、ライブラリの作成者は、オブジェクトのような一般的なものを使用して、さまざまなコンテキストを説明する必要があります。

それとも、この場合、別の方法で行うことができますか?

2.データベースなどの異なるコンテキストから何かを取得します

たとえば、Hibernate は私に List データ構造を返します。美しくないという理由だけで、List から ArrayList にキャストすることは禁止されていますか?

3session.setAttribute() .; session.getAttribute()- そしてオブジェクトはサービスメソッドに渡しますか? -ノーキャスティング方法は?

この質問を終えることで、「これは悪いのでやらないでください」というのは間違った態度であるか、最初からコンポーネント/機能が API に存在するべきではないかのいずれかであると真剣に考えています。

4

1 に答える 1

1

キャストの主な問題は、コンパイル時の型の安全性が得られないことです。可能な場合は、インターフェース(たとえば、前述のArrayListではなくList)または継承を使用します。ジェネリック型もあります。List<String>Object オブジェクトのリストの代わりに。

API を重くしすぎずに API で特定の型を提供するのは実際的ではない場合があります。最終的にオブジェクト参照を取得し、それらが使用されているコンテキストを知っているため、それらをキャストすることになります。

List vs ArrayList の例について...ここで List を使用するのは良いことです。API プロバイダーは、List インターフェイスを実装するオブジェクトを返すと言っているだけなので、リストとしてアクセスできます。あなたのプログラムは、あなたの API プロバイダーの内部実装を知りたくないし、クライアントに特別な配慮を与えたくありません。API を可能な限りジェネリック (クライアント固有、ただし実装はジェネリック) にすることで、API は可能な限り堅牢になる傾向があります。

したがって、「これをしないでください。悪いことです」というのは、実際には最後の手段として使用することを意味します。可能であれば、インターフェースまたは類似のものを使用することをお勧めします。

于 2013-09-26T02:18:04.147 に答える