java - 这种转换是否意味着多态性设计被破坏了?

标签 java casting polymorphism

我有一个定义“模块”的接口(interface):

public interface AIMModule {
    // Details not relevant
}

另一个为这些模块定义了一个容器:

public interface AIMModuleContainer {
    public void addModule( AIMModule module );  
}

这些“模块”实际上是 GUI 构造,因此我的容器的实现扩展了我正在使用的 GUI 工具包的 HLayout 小部件。它包含一个称为 moduleStack 的SectionStack。 SectionStack.addSection(SectionStackSection) 将节堆栈添加到 GUI 中,因此我的“模块”容器抽象如下所示:

public class UserContainer extends HLayout implements AIMModuleContainer {

@Override
public void addModule( AIMModule module )
{
    moduleStack.addSection( (SectionStackSection)module );
}

}

模块实现因此扩展了一个名为SectionStackSection的小部件:

public class AccountInformationModule extends SectionStackSection implements AIMModule {
    // Details not relevant
}

问题在于 addModule() 中调用 addSection() 的地方进行了强制转换。 AIMModuleContainer 包含 AIMModule,因此 addModule() 需要获取 AIMModule。但在实现层面, moduleStack 小部件插入了一个SectionStackSection,因此接口(interface)的“模块”需要根据实现进行强制转换。

这可行,但感觉不对。如果有人通过扩展除SectionStackSection 之外的其他内容来实现我的AIMModule 接口(interface),并将该AIMModule 传递到addModule() 中,则该转换将会中断。这似乎不对。

这个坏了吗?如果是的话,修复方法是什么?

最佳答案

这是错误的,因为您从不检查传递的参数是否是您期望的类型,即使如此,它也应该只采用您期望的类型。但这是不可能的,因为您的模块容器可以包含任何类型的模块。

每个模块容器只处理一种类型吗?如果是这样,请使用泛型。如果不是,这总体上是一个糟糕的实现,因为您认为它总是不是这样的。

关于java - 这种转换是否意味着多态性设计被破坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701114/

相关文章:

将结构指针转换为另一个结构

c++ - 在 C++ 中将结构类型转换为整数,反之亦然

c++ - Boost:如何在方法内部反序列化?

c# - 对象引用方法调用

java - 使用java mail multipart MIME仅读取最新回复的内容

java - 为什么 Spliterator<?> 将 NONNULL 定义为特征?

java - 从 Java 原始 int 转换为 double

java - Gson反序列化多态成员List变量为null

java - 如何在 Asterisk PBX 上强制终止时获取 DisconnectEvent

java - 如何在 Spring-Boot 微服务项目中实现 HATEOAS