2016-03-19 6 views
2

私はCar、Homeアダプタなどの特定のクラスを持ち、それらはすべてAdapterクラスに拡張されています。インスタンスをsetAdapterForListメソッドに渡します。 buyCar、getHomeのように。である私は何をしたい親クラスを自分のクラスにキャストする方法

は、

public void setAdapterForList(Adapter adapter) { 
    // some how get their type from adapter, Eg. CarAdapter 
    // and cast CarAdapter to it 
    Type type = adapter.getType(); 
    Type typedAdapter = (type) adapter; 
    typedAdapter.buyCar() 
    setAdapter(adapter); 
} 
+0

サイドノート:メソッドは、「setAdapterForList」と呼ばれている場合は、なぜ地球上であなたは内buyCar()などのメソッドを呼び出していますか?リストに何かを加えることは、リストに物を追加すること以外の副作用があってはなりません。 – GhostCat

+0

質問自体について:2つの選択肢があります。どちらかダウンキャスト(非常に頻繁に悪いデザインのにおい)を行う。または多型を使用します。 – GhostCat

+0

@Jägermeister多形性でどうやったらいいですか? – Mike

答えて

0

あなたはinstanceofを使用することができ、これは私が何をしたいですsetAdapterForList方法

listView.setAdapterForList(new CarAdapter(13)); 

で自分のタイプを取得することにより、自分のクラスにこれらのアダプタをキャストそれがどちらか一方であるかを確認する

public void setAdapterForList(Adapter adapter) { 
    if (adapter instanceof Car) { 
     Car c = (Car)adapter; 
     // stuff 
     return; 
    } 
    if (adapter instanceof Home) { 
     Home h = (Home)adapter; 
     // stuff 
     return; 
    } 
    // and so on... 
} 
+0

instanceofを使用したくない場合は、アダプターが5つ以上ある可能性があるため、キャストしたいと思います。他のブロックを使用せずにメソッドで型を取得してキャストすることはできません。 – Mike

+1

現実はあなたが望むものではなく、可能なものについてです。あなたは "外出先で"キャストすることはできません。(まあ、できますが、実行時にClassCastExceptionsの準備をしてください) – GhostCat

+0

もし私ができれば、どういうことか教えてください:) – Mike

1

それは自動的に行うことができます。 しかし、手動で次のように行うことができます。

CarAdapter carAd; 
if (adapter instanceOf CarAdapter){ 
    carAd = (CarAdapter) adapter; 
} 
+0

私はしませんinstanceofを使用したいと思いますが、5つ以上のアダプタがある可能性があるので、キャストしたいと思います。メソッドで型を取得して、それ以外のブロックがなければキャストできません。 – Mike

+0

「getType()」は何を返すと思われますか?ポイントは、クラス固有のメソッドを呼び出すときにコンパイラが特定のクラスを知る必要があることです。 – GhostCat

+0

@JägermeisterOpps !!はい。それで合っています。私の悪い。キャッチをありがとう。 –

関連する問題