- PR -

Generics の Cast について

1
投稿者投稿内容
t2
常連さん
会議室デビュー日: 2002/02/11
投稿数: 36
お住まい・勤務地: 茨木-藤沢
投稿日時: 2005-05-18 17:07
お世話になります
eclipse で、テストコードを書いていますが、標題の件で悩んでいます
どなたか解決法をご存じでしたら教えていただけないでしょうか?

以下の様なコードとします

コード:
public class foo {
	public void testMethod() {
		Map<String, Integer> map
			= (Map<String, Integer>) getObjcet("fieldName", obj);
	}

	// 汎用的なフィールド変数内容取得メソッド
	public Object getField(String fieldName, Object object) {
		Field field = object.getClass().getDeclaredField(fieldName);
	    field.setAccessible(true);
		return field.get(object);
	}
}



そうしますと、map に対する代入のところで、以下の様なwarningが出てしまいます

「Type safety: The cast from Object to Map<String, GUILibraryDefinition>
is actually checking against the erased type Map」

いろいろ記述を試してみましたが、単なるGenericsのないCastだと通りますが、
できればGenericsを使用したく、そうするとどうにもwarningが消えません

よろしくお願いします
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-05-18 18:33
何をしたいプログラムなのか、よくわからないです。
getObject()とgetField()がありますが、これはどういうメソッドですか?
Mapには何と何を格納したいのでしょうか?
もし、フィールド名とフィールドの値ならば、こんな感じになると思いますが?
コード:
Map<String, Object> map = new Map<String, Object>();
map.put("fieldName", getField("fieldName", obj));


t2
常連さん
会議室デビュー日: 2002/02/11
投稿数: 36
お住まい・勤務地: 茨木-藤沢
投稿日時: 2005-05-18 18:55
a-san、返答ありがとうございます

| getObject()とgetField()がありますが、これはどういうメソッドですか?

説明不足で失礼しました

これらのコードは、テスト用のコードで(JUnitを使っています)
getField()は、Refrectionを使って汎用的に、対象クラスインスタンスの
フィールド変数の内容を取得するようにしています

それで汎用的に Object の型で受け取る戻り値を、必要な変数へ
キャストしているのですが、パラメータを 2 つ使う型に限って
Warning が出て悩んでいるところです

a-sanが示していただいたコードですが、「new Map<String, Object>();」
のところで以下のようなエラーになってしまいます

Cannot instantiate the type Map<String,GUILibraryDefinition>

根本的に私が勘違いしているのでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 19:11
引用:

いろいろ記述を試してみましたが、単なるGenericsのないCastだと通りますが、
できればGenericsを使用したく、そうするとどうにもwarningが消えません


まず、実行時にはパラメータとして渡す型の情報は消えてしまっているはずですから、実行時の
キャストはできないでしょう。ですので、このようなコードを書くのはあきらめてください。
#でもこれって警告なのでコンパイルそのものはできるのでは?

引用:

a-sanが示していただいたコードですが、「new Map<String, Object>();」
のところで以下のようなエラーになってしまいます


Mapはインタフェースなのでインスタンス化できませんね
t2
常連さん
会議室デビュー日: 2002/02/11
投稿数: 36
お住まい・勤務地: 茨木-藤沢
投稿日時: 2005-05-18 19:30
ukさん、返答ありがとうございます

引用:
まず、実行時にはパラメータとして渡す型の情報は消えてしまっているはずですから、実行時の
キャストはできないでしょう。ですので、このようなコードを書くのはあきらめてください。



そうですか...
Javaは初心者なのでよくわかっていませんが、汎用的なメソッドで対応できないのは残念です
個別に型毎に変換メソッドを作って対応しないといけませんね

引用:
#でもこれって警告なのでコンパイルそのものはできるのでは?



はい、動作はするのですが、Warning の黄色いフラグも消そうと思って投稿しました


引用:
Mapはインタフェースなのでインスタンス化できませんね



失礼しました、でもやはりインタフェースだから汎用的にしたいなぁ...
(HashMap ではあるんですが)
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 19:34
引用:

t2さんの書き込み (2005-05-18 19:30) より:
Javaは初心者なのでよくわかっていませんが、汎用的なメソッドで対応できないのは残念です
個別に型毎に変換メソッドを作って対応しないといけませんね


興味があれば、以下のGenerics Tutorialを読んでみてください。
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
「7.2 Casts and Instanceof」にその辺の情報が書いてあります。
t2
常連さん
会議室デビュー日: 2002/02/11
投稿数: 36
お住まい・勤務地: 茨木-藤沢
投稿日時: 2005-05-18 19:46
ありがとうございます
ちょっと読んでみます
1

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