基本クラス Component があり、このクラスから継承する ComponentA、ComponentB などのクラスがあります。コンポーネント名のキーとコンポーネントの値を使用して、コンポーネントを HashMap に格納します。しかし、ComponentA の値を取得して関数を実行すると、Component クラスとして扱われます。ComponentA のメソッドを実行するために Component を ComponentA に型キャストする方法はありますか? または、コンポーネントを格納する別の方法を検討する必要がありますか?
3 に答える
1
@Overrideアノテーションを使用して、基本クラスのメソッドを実際にオーバーライドしていることを確認します。
public class Component {
...
public void doSomething() {
...
}
}
public class ComponentA extends Component {
...
@Override
public void doSomething() {
...
}
}
PSあなたはキャストをする必要はないはずです。ポリモーフィズムの利点の1つは、共通の基本クラスを介して異なるクラスのオブジェクトを使用できることです。キャストは、基本クラスに概念がない派生クラスの機能が必要な場合に使用します。基本クラスを通じて公開された機能にキャストを使用すると、そのメリットが失われます。
于 2012-11-24T06:13:24.613 に答える
1
ComponentA
としてマップに保存している場合Component
、オブジェクトはまだComponentA
です。その場合、型キャストを行うことができますが、インスタンスの型をブローとしてチェックすることをお勧めします。
Component element = map.get(componentKey);
if(element instanceOf ComponentA){
ComponentA elementA = (ComponentA)element;
//use the elementA
elementA.doSomething();
}else if (element instanceOf ComponentB){
ComponentB elementB = (ComponentB)element;
//use the elementB
elementB.doSomething();
}
さらに、からまでに必要なメソッドをオーバーライドする場合Component
はComponentA
、型キャストを行う必要はありません。前に述べたように、要素はまだ型ComponentA
であるため、のオーバーライドされたメソッドComponentA
が呼び出されます。
例えば
public class Component{
public void printClass(){
System.out.println("This is class Component");
}
}
public class ComponentA{
@Override
public void printClass(){
System.out.println("This is class ComponentA");
}
}
Map<String, Component> map= new HashMap<String,Component>();
Component component = new ComponentA();
map.put("comp", component);
Component component1 = map.get("comp");
component1.printClass(); //<-- prints "This is class ComponentA"
于 2012-11-24T06:13:59.707 に答える
1
コンポーネントタイプのオブジェクトがありますか?
コンポーネントc=//一部のコンポーネント
型キャストは単純です、それはただです
ComponentA a =(ComponentA)c
于 2012-11-24T06:12:28.933 に答える