【问题标题】:Whats the best to way convert a set of Java objects to another set of objects?将一组 Java 对象转换为另一组对象的最佳方法是什么?
【发布时间】:2010-05-01 00:25:50
【问题描述】:

来自一个真正的新手的基本 Java 问题。我有一组实现某个接口(接口“MyIfc”)的 Java 对象(属于“MyClass”类)。我有一组这些对象存储在我的类的一个私有变量中,声明如下:

protected Set<MyClass> stuff = new HashSet<MyClass>();

我需要提供一个公共方法,将这个集合作为“MyIfc”类型的对象集合返回。

public Collection<MyIfc> getMyStuff() {...}

如何进行转换?以下行给了我一个错误,它无法进行转换。我猜编译器知道 MyClass 类的对象实现了 MyIfc,因此会处理它。

Collection<MyIfc> newstuff = stuff;

感谢任何启发。

【问题讨论】:

  • 返回Collection&lt;? extends Mylfc&gt;怎么样?

标签: java collections casting set


【解决方案1】:

大概最正确的方法是:

    return new HashSet<MyIfc>(stuff);

如果班级太大而无法这样做,您可以这样做:

    return Collections.unmodifiableSet(stuff);

【讨论】:

  • 这与上面 Nathan 的方法具有相同的好处,但它通过构造函数在一行中完成,而不是调用“addAll”。因此,我认为这是最好的答案。
【解决方案2】:

编译器不喜欢你将东西分配给newstuff,因为它打开了将实现MyIfc但不是MyClass类型的东西放入newstuff的可能性。你可以让你的 getter 创建自己的集合:

public Collection<MyIfc> getMyStuff() {
    Collection<MyIfc> coll = new HashSet<MyIfc>();
    coll.addAll(myStuff);
    return coll;
}

【讨论】:

  • 我喜欢这种方法,因为我可以保留 MyClass 的集合——在这种情况下,我有时需要将它们作为 MyClass 使用。
【解决方案3】:

您无需进行任何转换。您必须将stuff 输入为Set&lt;MyIfc&gt;

背景:是的,如果你有一个MyClass 类型的对象,它也可以用作MyIfc 实例,这是正确的。但是您将您的 Set 显式键入为MyClass 类型。这与 MyIfc 类型的 Set 完全不同。毕竟,您还可以拥有其他实现MyIfc 的类,然后您也可以将它们放入您的Set&lt;MyIfc&gt;,但不能放入Set&lt;MyClass&gt;

【讨论】:

  • 如果我能够不将 HashSet 的成员视为 MyClass,这将是一个好主意。但是,就我而言,我需要这样做,所以我更愿意保留内部集合。
【解决方案4】:

Google collections 定义了一堆惰性适配器,可能适合你的用途。

特别是Collections2.transform。以下是有关如何调整您的收藏的示例:

Collection<MyIfc> newStuff =
  Collections2.transform(
    stuff,
    new Function<MyClass, MyIfc>( )
    {
      public MyIfc apply ( final MyClass from )
      {
        return (MyIfc) from; // This may throw a ClassCastException though
      }
    }
  )

【讨论】:

  • 对我来说似乎是一个非常奇怪的转换用法。为什么不在内部使用东西作为Set&lt;MyIfc&gt;。请注意,您的代码将返回一个 not 允许 add/addAll 的实时视图。
  • 我同意,做这一切没有意义。
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 2011-09-04
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多