我有一个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
,
另一个被称为Box
(box1
,box2
,box3
),
另一个被称为Shelve
(shelve1
)
现在有一个Room
的实例我可以执行以下操作:
room1.addChildren(box1);
room1.addChildren(box2);
room1.addChildren(shelve1,sheleve2);
room1.addChildren(box3);
现在我有一个Room
(room1
),其中有三个不同的框和一个Shelve
(shelve1
)。
现在,我想使用Box
方法获取room1
内的所有Collection<IElement> getChildren(Class<? extends IElement> eType);
个对象,
与room1.getChildren(Box.class)
中一样。但是,该方法仅返回IElement
s的集合。我希望它返回Collection<Box>
。
如果我通过了Shelve
,那么它应该返回Shelve
个对象的集合。
这可能吗?如果是这样,你怎么做? 我知道这看起来很奇怪,但是我有很多不同的对象可以容纳其他元素,我需要一种快速简便的方法来过滤不同的类型。
答案 0 :(得分:0)
您可以使用命名泛型类型声明泛型方法,而不是使用通配符。
<E extends IElement> Collection<E> getChildren(Class<E> eType);
这样,您获得的集合的泛型类型将与您传入的类匹配。
您的实现必须构造并返回其参数的适当泛型类型的集合。