通用返回方法由方法

时间:2016-11-28 16:05:50

标签: java generics return-type

我有一个Java界面:

public interface IElement{

    public String getId();
    public String getName();

    /***
     * adds an IElement to this elements children
     * @param child
     */
    void getAddChild(IElement child);

    /***
     * returns all children
     * @return
     */
    Collection<IElement> getChildren( );

    /***
     * returns all children which match the Class of the passed IElement
     * @param eType - the class type to match
     */ 
    Collection<IElement> getChildren( Class<? extends IElement> eType);
}

这个想法是IElement可能包含其他IElement的集合。

我需要方法Collection<IElement> getChildren(Class<? extends IElement> eType)来返回匹配的兄弟姐妹的集合。

假设我有三个类,它们都扩展了IElement。 一个被称为Room, 另一个被称为Boxbox1box2box3), 另一个被称为Shelveshelve1

现在有一个Room的实例我可以执行以下操作:

room1.addChildren(box1);
room1.addChildren(box2);
room1.addChildren(shelve1,sheleve2);
room1.addChildren(box3);

现在我有一个Roomroom1),其中有三个不同的框和一个Shelveshelve1)。 现在,我想使用Box方法获取room1内的所有Collection<IElement> getChildren(Class<? extends IElement> eType);个对象, 与room1.getChildren(Box.class)中一样。但是,该方法仅返回IElement s的集合。我希望它返回Collection<Box>。 如果我通过了Shelve,那么它应该返回Shelve个对象的集合。

这可能吗?如果是这样,你怎么做? 我知道这看起来很奇怪,但是我有很多不同的对象可以容纳其他元素,我需要一种快速简便的方法来过滤不同的类型。

1 个答案:

答案 0 :(得分:0)

您可以使用命名泛型类型声明泛型方法,而不是使用通配符。

<E extends IElement> Collection<E> getChildren(Class<E> eType);

这样,您获得的集合的泛型类型将与您传入的类匹配。

您的实现必须构造并返回其参数的适当泛型类型的集合。