- PR -

java5のGenericsでの型キャストに関して

1
投稿者投稿内容
夕月夜
会議室デビュー日: 2005/10/28
投稿数: 7
投稿日時: 2006-01-24 14:25
ある決まったライブラリ(lib)が List getList() を提供して、
それを使う自分が、

List<MyFoo> getFoolist() {
return lib.getList();
}

とList<MyFoo>にして返したい場合、

return (List<MyFoo>) lib.getList();

とすれば良いのでしょうか。
これが、eclipse3.1で警告になるのですが、どういう意味でしょうか。

ジェネリクスでのキャストに関する知識が乏しく困っています。
アドバイスをよろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-24 15:04
読んだ人が「どんな警告がでるっけな・・」って考えなくても済むように貼り付けてはいかがでしょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-24 15:07
考えました。チェックされない型をキャストしようとしてます、といった警告ですよね?

ライブラリのインターフェースの返り値が <MyFoo>のリストであることを保証していないわけですから、それをList<MyFoo>にキャストすると警告がでるのはしょうがないことです。
ライブラリを利用する上で<MyFoo>型以外のインスタンスが含まれないよう注意して呼び出してあるのであれば良いでしょう。
ライブラリ側で generics をサポートして貰わない限りどこかで必ずこの類の警告がでることになるかと思います。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-01-24 15:37
そもそもジェネリクスというのは、
インスタンスの振る舞いに制約を掛けるものです。
それこそ、この場合は変数Listの宣言からインスタンスの生成、要素の格納から全部。
今回の場合、どうしても警告を消したいのなら、
ライブラリから取得したListを、List<MyFoo>に再構成する、という方法もありますけど。

「値を取り出すときのキャストを省略したいがため」だけに利用しようというのは、
クラスの継承を差分プログラミングに利用しようとするのと同じくらいお門違いかと。

「そんなこと考えてない」って事でしたら、失礼しました。
夕月夜
会議室デビュー日: 2005/10/28
投稿数: 7
投稿日時: 2006-01-25 13:49
インギさん、Edossonさん。返答ありがとうございました。

警告は、

Type safty : The expression of type List needs unchecked conversion to conform to List<MyFoo>

です。

> チェックされない型をキャストしようとしてます、といった警告ですよね?

ですね。

eclipseの警告設定のJ2SE5.0オプションで、
「raw型に対する安全でない型操作」を「無視」にすると警告は消えました。
ですが、このケース以外も無視されるのが気になるし、
かといって、
警告にしてイエローマークが常に貼り付いているのも気になるし……。

>どこかで必ずこの類の警告がでることになるかと思います。

そういうことになるのかなぁ、と思っていた予測と同じで、
不安が解消しました。シンプルかつ明快な表現に感謝です。

> List<MyFoo>に再構成する

eclipseの警告を消すためだけで、さすがにこれは出来ませんよね。

私が思ったのは、もしかしたら、
CastType t = (CastType) object;
というような以前からある記述方法ではなく、
generics流のキャストの記述方法があって、
それだと警告もなくサクッとキャストできるのかなぁとか、
そういうことをちょろっと思ったわけです。(ないようでしたが...)
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-01-25 14:03
こんにちは、さくらばです。

引用:

eclipseの警告設定のJ2SE5.0オプションで、
「raw型に対する安全でない型操作」を「無視」にすると警告は消えました。
ですが、このケース以外も無視されるのが気になるし、
かといって、
警告にしてイエローマークが常に貼り付いているのも気になるし……。



後ろ向きな解決ですが...

@SuppressWarnings アノテーションを使ってみたらいかがですか?
とのっち
会議室デビュー日: 2003/09/26
投稿数: 8
投稿日時: 2006-01-25 17:33
引用:

generics流のキャストの記述方法があって、



たとえば、List<? extends Hoge>のように記述すると、HogeのサブクラスをGenericsに指定したListを代入できるようになりますよね。

たとえば、HogeのサブクラスPiyo1やPiyo2がある場合、

List<? extends Hoge> list1 = new List<Piyo1>();



List<? extends Hoge> list2 =new List<Piyo2>();

と書けます。これも、一種のキャストのようなものでしょうかね。
1

スキルアップ/キャリアアップ(JOB@IT)