关于继承:在子类java中更改类变量类型

Change class variable type in subclass java

我有一个叫做"模块"的班

1
2
3
4
5
6
7
8
9
10
public abstract class Module {

    protected Map<String, Port> ports;

    ...

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

一个名为design的类,它是模块的一个子类

1
2
3
4
5
6
7
8
9
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
    }
}

基本上,我想做的只是将topports添加到设计中,并在从getports()函数返回时对类型进行强制转换。

我现在正在做的是在getports函数返回main之后将端口强制转换为topports,但是这非常简单,并且在我的代码上构建的人将无法立即理解何时返回topport。

我还尝试创建另一个函数,而不是重写getports()。

1
2
3
4
    //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
    }

正确的方法是什么?

更具体的问题

我一直在玩代码,我可以将其添加到我的"设计"类中:

1
2
3
4
5
6
7
public TopPort getTopPortByName(String porName) {
    return (TopPort) ports.get(porName);
}

public void addPort(TopPort port) {
    this.ports.put(port.getName(), port);
}

然而,每当我试着做这个演员时,它都不起作用:

1
return (Map<String, TopPort>) this.ports;

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


您需要使类成为通用的。

1
2
3
4
5
6
7
8
9
10
11
public abstract class Module<P extends Port> {

   protected Map<String, P> ports;

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


class Design extends Module<TopPort> { }

不过,我不确定这是否算过分了。