在子类java中更改类变量类型

bri*_*inz 5 java polymorphism inheritance

我有一个名为“模块”的课程

public abstract class Module {

    protected Map<String, Port> ports;

    ...

    public Map<String, Port> getPorts() {
        return ports;
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个名为 Design 的类,它是 Module 的子类

public class Design extends Module{
    ...

    //want to do this but doesn't compile
    @override
    public Map<String, Port> getPorts() {
        return (Map<String, TopPort>) ports;  //TopPort is a subclass of Port
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的只是将 TopPorts 添加到 Design 并在从 getPorts() 函数返回时已经转换类型。

我现在正在做的是在 getPorts 函数在 main 中返回后将 Ports 转换为 TopPorts,但这非常糟糕,在我的代码上构建的人将无法立即理解何时返回 TopPort。

我还尝试创建另一个函数而不是覆盖 getPorts()

    //want to do this as well but doesn't compile
    public Map<String, TopPort> getTopPorts() {
        return (Map<String, TopPort>) ports;  //TopPort is a subclass of Port
    }
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?


更具体的问题

我一直在玩代码,我可以在我的“设计”类中添加它:

public TopPort getTopPortByName(String porName) {
    return (TopPort) ports.get(porName);
}

public void addPort(TopPort port) {
    this.ports.put(port.getName(), port);
}
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试进行此转换时,它都不起作用:

return (Map<String, TopPort>) this.ports;
Run Code Online (Sandbox Code Playgroud)

为什么即使类型转换适用于其每个成员,它也不适用于整个地图?

Thi*_*ilo 3

您需要使您的课程具有通用性。

public abstract class Module<P extends Port> {

   protected Map<String, P> ports;

   public Map<String, P> getPorts() {
      return ports;
   }
}


class Design extends Module<TopPort> { }
Run Code Online (Sandbox Code Playgroud)

不过,我不确定这是否有点过分。