JAVAで動的にキャストする方法をしりませんか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/07/21 19:31:59
  • 終了:--

回答(7件)

id:angelsong No.1

angelsong回答回数94ベストアンサー獲得回数02005/07/21 20:39:36

ポイント16pt

http://www.atmarkit.co.jp/fjava/devs/object03/object03.html

@IT:連載:ここから始めるオブジェクト指向 第3回

動的にキャストと言うと、ポリモフィズムのことを指しているのでしょうか。

SubClass aObj = (SubClass)getSuperClass();と言ったコーディングでサブクラスへのキャストは可能です。


ここを動的に、と言うことであれば、Classクラスを使用すれば可能です。

aClass aObj = (aClass)Class.forName(”aClass”);

””で渡す引数はString型であれば良いので、プログラム中で動的に変更することが可能です。誤ったクラス名を与えると、ClassCastExceptionがスローされます。

id:halyan

ありがとうございます。

でも私は(aClass)を動的に例えばaClassを変数で表現できないか考えています。

2005/07/21 20:48:25
id:akibare No.2

akibare回答回数157ベストアンサー獲得回数52005/07/21 21:44:44

ポイント16pt

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#cas...(java.lang.Object):detail]

J2SE1.5からClass.cast(Object obj)というメソッドが追加されたみたいですが、はっきり言って用途が分かりません。


public void Fuga(Object o)

{

Object o2 = Class.forName(”Hoge”).cast(o);

}


こんなことしても意味無いですし

http://forum.java.sun.com/thread.jspa?threadID=627778&tstart...

Java Technology Forums - dynamic type casting

ここの質問の方と同じことをしたいのだと推測しますが、「無理」みたいです。


* Interfaceを使う

* ベースクラスにダウンキャストする

* Proxyを使う

* ↓みたいにやってみる

Method m = Class.forName(”Hoge”).getMethod(”Fuga”,String.class);

m.Invoke(o, ”Hage”);

ここの方も同じ質問。ダイナミックキャストして、結局は何らかのメソッドを呼び出したい訳ですよね。素直に↓みたいに書くのがシンプル?


if(data instanceof SubClass){

SubClass x = (SubClass) data;

}

else

{

xxxxx

}

ここにも煮たような質問

id:halyan

ありがとうございます。

(SubClass)を変数化できないでしょうか。

2005/07/22 12:19:33
id:kenmaz No.3

kenmaz回答回数5ベストアンサー獲得回数02005/07/21 22:17:31

ポイント16pt

URLはダミーです。


回答になっていませんが・・・


動的にキャストというと・・・


1: Object obj = ...;

2: XXX type = String;

3: String str = (type)obj;


こんな感じでしょうか?

仮に上のようなことが可能であっても、キャストした変数の

受け取り先(ここではstr)のクラスは静的に定義せざるを得ないと

思われるのですが・・

(strをObject型の変数としてしまってはキャストの意味はないですし・・)


どのような使い方を想定されているのでしょうか?

id:halyan

ありがとうございます。

3:のような使用でただしString型でなくプリミティブでないクラスにキャストする場合で丁度(Type)の

Typeを変数化したいんです。

2005/07/22 12:22:49
id:wasisan No.4

wasisan回答回数86ベストアンサー獲得回数72005/07/21 23:41:20

ポイント16pt

instanceofでオブジェクトのクラスを判定して,if文で分岐してキャストという

方法(URL参照)では駄目なのでしょうか?

http://www.hellohiro.com/reflection.htm

JavaでHello World リフレクション編

たぶん,クラスの指定を変数化するといったことは難しいと思います

(これを異なった形で実現しているのがjava1.5に導入されたgenerics(テンプレート)な気がします).


基本的にメタ操作なので,リフレクション機能を使えば可能だとは思います(URL参照)


理想的には関数のオーバーライドで

ダウンキャストすることなく作ることが望ましいと思います

id:halyan

ありがとうございます。

if文だと個数が20個以上あるのでキャストを変数化

したいです。

2005/07/22 12:24:45
id:tarchan No.5

たーちゃん回答回数200ベストアンサー獲得回数22005/07/22 01:26:37

ポイント16pt

Javaで動的にクラスを扱うにはリフレクトを使います。

ポリモフィズムをするのであればObjectクラスに代入するか共通のスーパークラスに代入するべきですが、本当にやりたいことはキャストですか?

C言語のキャストとは全く意味が違うので注意してください。

id:halyan

ありがとうございます。

Objectクラスを継承すれば特定のクラスにキャストしなくても特定のクラスのメソッドを参照できますか。

2005/07/22 12:28:00
id:quintia No.6

quintia回答回数562ベストアンサー獲得回数712005/07/22 16:16:38

ポイント10pt

URLは半分ダミーです。


2.の回答の

* Interfaceを使う

* ベースクラスにダウンキャストする

* Proxyを使う

の部分や、5.の回答の「共通のスーパークラスに代入するべきです」の部分は意図的に無視してますか?

それともこれらの回答の意味が判らないですか?


4.の回答に対して

if文だと個数が20個以上あるのでキャストを変数化したいです。

とコメントしていますが変数化してどうするのでしょうか?

それら20個のクラスが別々のメソッドを持っていて別々の処理をする必要があるならばif文で書き連ねる他ありません。

そうでないとするならば、その「20個以上あるというクラス群」は「同じ引数を取る同じ名前のメソッド」を持っているのでないですか?(*1)


そうであれば2.の回答にある通りinterfaceを利用するか、そのメソッドを持つベースクラスを用意するべきです。

そして20個あるというクラス群は、interfaceを付与して実装を書くか、ベースクラスから派生させるのです。

interfaceを使う場合にどんなコードになるか書いておきます。


interface HogeInterface {

void hoge(...);

}

class ClassFoo implements HogeInterface {

void hoge(...){

}

}

class ClassBar implements HogeInterface {

void hoge(...){

}

}

class ClassBaz implements HogeInterface {

void hoge(...){

}

}


と与えられる時、


HogeInterface hogeInstance = data;

hogeInstance.hoge(...);


と書くことができて、かつ変数dataにはClassFoo,ClassBar,ClassBazのどのインスタンスを与えてもいいのです。

そして、与えたインスタンスのhogeメソッドを実行できます。


(*1)の仮定が間違っているならばポイント不要です。が、その場合はキャスト指示詞の(SubClass)を変数化した*その後に*、どのような処理を書きたいのかをぜひ示してください。

id:tarchan No.7

たーちゃん回答回数200ベストアンサー獲得回数22005/07/22 23:07:41

ポイント10pt

メソッドを変数化することは簡単にできます。リフレクトを使ってもできますが、java.beans.EventHandlerを使って以下のように書きます。

//準備

Object target = xxx;

String method = ”zzz”;

ActionListener act = (ActionListener)EventHandler.create(ActionListener.class, target, method);


//実行

act.actionPerformed(new ActionEvent(...));


//結果

xxx.zzz();が実行されます。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません