【问题标题】:How to store objects of different types in a container?如何在容器中存储不同类型的对象?
【发布时间】:2012-10-11 08:40:14
【问题描述】:

我想知道我是否可以拥有一个数组(或基本上是一个表),其中每个元素都是一组不同类型的对象。我的意思是我想创建这样的东西(我知道它的语法不正确,只是想证明我的想法):

List<String, int, double, Date, ... , etc > list_name

我这样做是为了确保当我将所有这些信息保存到我的数据库时,我会将所有这些信息都保存在数据库的同一个条目中。这是因为我从不同站点进行了一些网络抓取以收集所有这些数据,即在列表中,字符串可能来自站点 A,int 可能来自站点 B,等等。我发现某些信息可能由于某些原因而丢失(比如说,对于列表的特定元素,可能缺少来自站点 A 的字符串,其他数据就在那里,非常好。)。如果我将这些数据存储到单独的列表中,恐怕会有一些数据不匹配。

现在我的解决方案是创建一个类,比如 ClassA:

ClassA{

public String info1
public int info2
public double info3
..
..
public wtever info

}

然后我会有一个 ClassA 列表

我想知道是否有更好的方法来实现这一点?

【问题讨论】:

  • 不要使用泛型我的意思是它可以在 JDK 1.4 中正常工作,但这不是推荐的解决方案......:P

标签: java containers


【解决方案1】:

我这样做是为了确保当我将所有这些信息保存到我的数据库时,我会将所有这些信息都保存在数据库的同一个条目中。

是的,通过创建一个类来保存所有值,您做了正确的事情。

而且,正如您已经注意到的,如果您希望执行多个数据库插入/更新,则可以创建此对象的 List

许多持久性方案在定义类(称为DAOs)的基础上运行,以表示存储在各个表中的数据。使用支持注释类的持久性提供程序(例如Hibernate)可以真正简化您与数据库的交互。我会更详细地推荐你research this topic

【讨论】:

    【解决方案2】:

    您可以使用简单的List&lt;java.lang.Object&gt;,因为Java 中的所有类都是java.lang.Object 的子类。但是,这很容易出错,如果您不小心处理它,可能会在运行时抛出 ClassCastException。就像您提到的那样,List&lt;ClassA&gt; 是正确的。但请确保在设计 ClassA 时一切正常。

    【讨论】:

    • 这正是我想要的。然后使用“instanceof”检查该对象是从哪个类创建的,然后将该对象转换为相应的类型。
    【解决方案3】:

    您创建用于保存这些不同类型属性的类的方式似乎不错。 然后你可以使用ArrayListList 接口的实现,如下所示:

    ArrayList<ClassA> list = new ArrayList<ClassA>();
    

    然后您可以轻松地填充和操作它。

    对于您的数据库操作,我建议您使用 DAO(data access object) 类和 ma​​pper 类来方便您对数据源的持久化操作。

    【讨论】:

      【解决方案4】:

      你可以做的是创建一个抽象超类,你的所有类都将扩展它,然后列出它。任何扩展这个超类的类都将放入同一个列表中。

      当您操作您的集合时,请确定您正在处理的是什么类型的对象。

      public abstract class ClassA {
          // Empty
      }
      
      public class ClassB extends ClassA {
          // something something
      }
      
      public class ClassC extends ClassA {
      
      }
      
      public class main {
          List<ClassA> list.....
      }
      

      【讨论】:

      • ListObjects 不会做同样的事情吗?
      • 是的,但您可能在类型转换方面遇到问题。
      【解决方案5】:

      我也会这样做,即创建一个代表您要保存的一组内容的对象(也许背后隐藏着一个域概念?),然后有一个该类型的列表。

      【讨论】:

        【解决方案6】:

        由于 Java 中的所有(有节制的事实)对象都继承自 Object,因此您可以编写 List&lt;Object&gt;... 并在需要时将对象投射到其中。请记住,这要求您完全控制不同对象的类别。

        【讨论】:

        • 我认为这是一个很好的解决方案,但再次正确地指出,您必须非常小心类型安全
        • 如果你仔细阅读这个问题,我认为这不是一个好的解决方案。
        猜你喜欢
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        相关资源
        最近更新 更多