类型转换基类到继承的类以调用函数(JAVA)



我有一个基类组件,我有从这个类继承的类,如组件A,组件B等。我将组件存储在 HashMap 中,其中包含组件名称的键和组件的值。但是,如果我获取组件 A 的值并对其执行函数,它会将其视为组件类。是否可以将组件类型转换为组件 A 以执行组件 A 的方法,或者我是否需要研究存储组件的替代方法?

您有一个组件类型的对象?

组件 c =//某些组件

类型转换很简单,只是

组件 A a = (组件 A)c

使用 @Override 注释来确保你确实重写了基类的方法:

public class Component {
    ...
    public void doSomething() {
        ...
    }
}
public class ComponentA extends Component {
    ...
    @Override
    public void doSomething() {
        ...
    }
}

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

如果您将ComponentA存储在地图上作为Component,那么您的对象仍然是ComponentA 。在这种情况下,您可以进行类型转换,但我建议将实例类型检查为 blow:

        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"

最新更新