我有一个过滤某些值列表的函数,它使用instanseof构造:
public static List<View> getAllChildren(View v) {
/* ... */
if (v instanceof Button) {
resultList.add(v);
}
/* ... */
}
我想让它更通用,并将Button设置为函数参数:
public static List<View> getAllChildren(View v, ? myClass) {
/* ... */
if (v instanceof myClass) {
resultList.add(v);
}
/* ... */
}
但我不知道如何将myClass传递给该函数。 请告诉我如何概括这个功能?
答案 0 :(得分:8)
您可以使用Class
类将类类型作为参数传递。请注意,它是通用类型。此外,instanceof
运算符仅适用于引用类型,因此您必须将其翻转才能使其工作:
public static List<View> getAllChildren(View v, Class<?> myClass) {
/* ... */
if (myClass.isInstance(v)) {
resultList.add(v);
}
/* ... */
}
为了像这样传递Class
类型,您只需使用所需类的名称,并附加“.class”。例如,如果您想使用Button
类调用此方法,则可以这样执行:
getAllChildren(view, Button.class);
或者,如果你有一个你想要这个类的实例,你可以使用getClass()
方法:
Button b = new Button();
getAllChildren(view, b.getClass());
正如Evan LaHurd在评论中提到的,isInstance()
将检查这两个类是否与赋值兼容,因此它们可能不是完全相同的类。如果你想确保它们完全同一个类,你可以像这样检查它们是否相等:
myClass.equals(v.getClass());
或
myClass == v.getClass();
正如bayou.io 所指出的那样,也适用于这种情况
答案 1 :(得分:3)
如果您需要更多灵活性,可以使用{8}方法接受使用Java 8 lambdas的任何过滤器:
getAllChildren
如果您愿意,或者如果Java 8不可用,请使用策略模式。
出于您的目的,gla3dr的解决方案可能是最好的,但如果您需要更多功能,请考虑这些选项。