Java 向下投射vs.多场

Java 向下投射vs.多场,java,interface,downcast,Java,Interface,Downcast,我经常读到向下投射是一件坏事,现在我需要它,我问自己在我的例子中有什么选择: 我有一个接口A 实现接口A的三个类:X1、X2、X3 这些类描述相同的内容,但使用不同的“格式”和过程(简单地说),这就是为什么我必须对它们进行划分 现在我有一节课如下: 类测试{ obj; } 根据“格式”的不同,我可以选择obj=newx1()、obj=newx2()或obj=newx2() 从现在开始,在处理对象时,我必须在这个类中使用大量向下转换来访问类方法(除了a中的方法)。我看到的唯一替代方法是为每个可能的

我经常读到向下投射是一件坏事,现在我需要它,我问自己在我的例子中有什么选择:

我有一个
接口A

实现接口A的三个类:
X1、X2、X3

这些类描述相同的内容,但使用不同的“格式”和过程(简单地说),这就是为什么我必须对它们进行划分

现在我有一节课如下:

类测试{
obj;
}

根据“格式”的不同,我可以选择obj=newx1()、obj=newx2()或obj=newx2()

从现在开始,在处理对象时,我必须在这个类中使用大量向下转换来访问类方法(除了a中的方法)。我看到的唯一替代方法是为每个可能的类创建一个字段,其中只有一个被使用过。这看起来也很糟糕

对更好的设计有什么建议吗

谢谢你的帮助

编辑:这是我的场景(简单地说):

我的主类是特定数据的容器。其中之一是内容属性(有点像HTTP请求的主体)。内容可以是:

  • 纯文本(两个单独的字符串)
  • 文件(仅文件路径、md5等)->稍后将加载到输入流中
  • 未知(字节)->我不能也不必知道。稍后的上下文将为我提供有关它的信息
对于每种类型,我都创建了一个类(TextContent、FileContent、UnknownContent)。它们实现了具有getBytes()方法的接口内容,该方法将以字节数组的形式返回内容

内容的使用:

  • 创作
  • ContainerClass.setContent(纯文本)
    ->
    BaseInterface content=newtextcontent(纯文本)
    ContainerClass.setFile(文件)
    ->
    BaseInterface content=新文件内容(文件)
    ContainerClass.setContent(someBytes)
    ->
    BaseInterface content=newUnknownContent(someBytes)

  • 我的容器对象可以保存为json。仅当内容对象是文本或文件时,才会保存它(因此我无法在接口中实现toJsonObject()

  • 当内容是文本时,我想检查它的某些模式。我在容器类之外使用Matcher类(例如,
    ((TextContent)container.content).getText()
    ->->遗憾的是,FileContent没有可以返回的单个文本,因此我也无法实现该文本)。我可以在容器类中添加一个getContentAs..()方法,该方法将对其进行适当的强制转换,但我觉得我只是解决了基本问题:(


  • 由于数据是相同的,所以听起来您只需要一个类,而不是多个。将格式与数据分开。

    Test
    不应该关心
    obj
    X1
    还是
    X2
    -它应该只知道或关心
    obj
    A
    !即使是
    Test
    的事实如果存在
    X1
    X2
    是一个设计错误。您需要调查为什么
    Test
    需要知道这一点,以找出设计的错误之处;但是向下转换是一个迹象,表明抽象处于错误的层。例如,如果
    Test
    根据运行时类型不断决定行为
    obj
    那么也许访问者模式会更好。如果流程相似但有不同的实现,为什么不在接口中声明一个抽象方法,让每个类都超越这些方法呢?你能发布一些示例代码吗?可能是(非常)简化的情况下,你会沮丧吗?@Boristespider谢谢你的回答。我知道我在某个地方犯了一个设计错误,但我很难找到解决方法。我更新了我的帖子来展示我的场景。也许你对此有一些想法。谢谢!@jmw5598每种类型都有一些“独特的”它们不与其他人共享的方法。要访问它们,我需要向下转换。多个类都可以。OO编程是关于行为和数据的。关键是行为和数据存储在一个“类”中,有一个
    接口
    暴露常见行为。这个答案几乎没有意义。