9

私はこれに対する答えを探していましたが、役に立ちませんでした。私の質問は、ジェネリックでダウンキャストできないのはなぜですか。Job というクラスがあり、Model というクラスを拡張します

Job extends Model

ここで、モデルのリストを生成する再利用可能なコードからジョブのコレクションを取得します

// error: Cannot cast from List<Model> to List<Job>
List<Job> jobs = (List<Job>) jobMapper.fetchAll();

ここで、jobMapper.fetchAll() は、内部の各モデルがジョブ オブジェクトであるリストを返します。

私はできるので、これがうまくいくと思いました:

EditText mUsername = (EditText) findViewById(R.id.editUserName);

これは単純なダウンキャストです。

4

4 に答える 4

12

Java ではこれが許可されていないため、これを行うことはできません。これを読む。トリックを行う必要があります:

 List<Job> jobs = (List<Job>) ((List<?>)jobMapper.fetchAll());
于 2013-03-15T08:25:46.143 に答える
3

次のことができます。

List<Job> jobs = (List) (jobMapper.fetchAll());

(そして、あなたがあなたの場合にそれが安全であると確信しているなら、警告を抑制してください)

List<Job>とList<Model>が同じリストを指していると、後者にModelインスタンスを追加し、List <Job>にModelを作成できるため、コンパイラは試行したキャストを許可しません。型安全性を損なうアイテム。

したがって、この種のトリックを許可するときは注意してください。後で、発生するとは思わないClassCastExceptionの形式で返される可能性があります。

最後の質問について:JobModelであり、Job[]Model[]ですが、コレクションには当てはまらないことに注意してください。List<Job>List<Model>ではありません。これは少し驚くべきことですが、上記の私の説明から得られます。警告/エラーなしでこのキャストを許可すると、タイプの安全性が損なわれます。

于 2013-03-15T08:31:43.827 に答える
0
List<Job> jobs = jobMapper.fetchAll();

間違っています、それは決してジョブのリストを明示しません。

使用する

List<? super Job> jobs = jobMapper.fetchAll();

代わりは。

于 2013-03-15T08:38:36.753 に答える
0

実行時エラーが発生する/発生する可能性があるため、許可されていません。リストにクラスではないオブジェクトが既に含まれている場合はどうなりJobますか?

次のいずれかを行う必要があります。

  1. jobMapper.fetchAll()return に変更しList<Job>ます。

  2. リストの代わりにオブジェクトをキャストします。Job job = (Job) jobs.get(0).

于 2013-03-15T08:40:55.637 に答える