0

我有一个基类 Component,并且我有 ComponentA、ComponentB 等类继承自此类。我将组件存储在 HashMap 中,其中包含组件名称的键和组件的值。但是,如果我获得 ComponentA 的值并对其执行功能,它会将其视为 Component 类。是否可以将 Component 类型转换为 ComponentA 以执行 ComponentA 的方法,或者我是否需要研究另一种存储组件的方法?

4

3 回答 3

1

You have an object of type component?

Component c = //some component

The type cast is simple, it's just

ComponentA a = (ComponentA)c

于 2012-11-24T06:12:28.933 回答
1

使用 @Override 注释确保您实际上覆盖了基类的方法:

public class Component {
    ...

    public void doSomething() {
        ...
    }
}

public class ComponentA extends Component {
    ...

    @Override
    public void doSomething() {
        ...
    }
}

PS你不应该需要做任何演员。多态性的一个好处是它允许您通过公共基类使用不同类的对象。当您需要基类没有概念的派生类中的功能时,可以使用强制转换。对通过基类公开的功能使用强制转换只会破坏这种好处。

于 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();
        }

此外,如果您覆盖所需的方法 from ComponenttoComponentA那么您不需要进行类型转换。正如我之前提到的,您的元素仍然是类型ComponentA,因此ComponentA将调用 in 的覆盖方法。

例如

  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 回答