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; |
为什么类型转换不适用于整个地图,即使它适用于每个成员?
- 为什么不在"设计"中添加另一个"顶级"地图?
- 这是一个可行的解决方案,但我想保留"模块"和"设计"类的抽象和含义。设计还包含端口,但它们是一种称为Topports的特殊端口
- 为了跟进@mohsaied的想法,是否有可行的方法将Port实例转换为从不失败的TopPort实例?
- 每当我将"端口"添加到"设计"实例中时,它总是一个"顶级端口"。所以真正的港口类型(不知道这是否是一个真正的术语)在设计上总是一流的。这就是为什么我可以在方法返回main之后对它们进行强制转换,而不会得到运行时错误。我对如何在类内完成这项工作来抽象掉这种类型转换感到茫然。
您需要使类成为通用的。
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 > { } |
不过,我不确定这是否算过分了。
- 谢谢,我一点也没想到!不过,这有点过分了。模块还有许多其他的子类,以及许多依赖它的代码。将其更改为泛型可能会迫使我进行大量重构。只有在"设计"类中我才想这样做。@thilo
- 回复:重构:最小的更改是将子类中的所有extends条款都更改为包含。这不会破坏使用它们的代码。
- 哦,我明白了,这也许值得一试……你能回顾一下我更具体的问题吗?主要的问题似乎是地图的排版。你知道为什么这样不行吗?@ Thilo谢谢
- 这是另一个问题。以前有人问过,我会帮你找一个链接。
- 到了:stackoverflow.com/questions/3246137/&hellip;
- 哦,很抱歉再次询问。谢谢你在这方面的帮助。@ Thilo