作为函数参数的类

时间:2015-09-14 21:14:17

标签: java

我有一个过滤某些值列表的函数,它使用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传递给该函数。 请告诉我如何概括这个功能?

2 个答案:

答案 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的解决方案可能是最好的,但如果您需要更多功能,请考虑这些选项。