2010-04-30 118 views
2

基本的Java问题来自一个真正的新手。我有一组实现特定接口(接口“MyIfc”)的Java对象(类“MyClass”)。我有一组存储在私有变量在我的课,这些对象被声明如下:将一组Java对象转换为另一组对象的最佳方式是什么?

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

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

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

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

Collection<MyIfc> newstuff = stuff; 

任何启发感激。

+1

如何返回'集合<?扩展Mylfc>'? – 2010-04-30 16:05:59

回答

6

可能是最正确的方法是:

return new HashSet<MyIfc>(stuff); 

如果该类太大做到这一点,你可以这样做:

return Collections.unmodifiableSet(stuff); 
+0

这与Nathan的方法具有相同的好处,但通过构造函数在一行中执行,而不是调用“addAll”。出于这个原因,我认为这是最好的答案。 – HDave 2010-04-30 18:11:15

1

你不需要做任何转换。您必须输入stuff作为Set<MyIfc>

背景:是的,如果您有一个类型为MyClass的对象,则该对象也可以用作MyIfc实例。但是,您明确地键入了您的Set作为MyClass类型。这只不过是一组类型MyIfc。毕竟,你也可以有其他类实现MyIfc,然后你也可以把它们放到你的Set<MyIfc>中,但不能放入Set<MyClass>

+0

如果我不能将HashSet的成员视为MyClass,这将是一个好主意。但是,在我的情况下,我需要这样做,所以我更愿意将内部集合保持原样。 – HDave 2010-04-30 18:10:16

3

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

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

我喜欢这种方法,因为我得到了MyClass的集合 - 在这种情况下,我需要将它们作为MyClass来处理。 – HDave 2010-04-30 18:09:26

0

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 
     } 
    } 
) 
+0

看起来像一个非常奇怪的使用变换给我。为什么不在内部使用东西作为'Set '。而且,你的代码将返回一个实时视图,它不*允许添加/添加所有。 – whiskeysierra 2010-04-30 21:55:15

+0

我同意,做这一切都没有意义。 – 2010-04-30 22:14:20

相关问题