2015-12-07 3 views
1

Я хочу вернуть true, если аргумент является экземпляром класса в списке. Вот мой сниппет:Как проверить, является ли элемент подклассом элемента в списках классов

private Class[] classes; 

public boolean belongsToList(Object obj){ 
    return Arrays.asList(classes).contains(obj.getClass()); 
} 

но когда список классов содержит суперкласс из OBJ класса и не точный класс ребенок сам, этот код возвращает ложь.

Как мне сделать это вернуть true для экземпляров подкласса элемента в classes?

+0

мне не нужно .getSuperclass(), потому что не будет работать с классами чида в списке – kuranes

ответ

1

Используйте поток classes с предиката на основе Class#isInstance():

public boolean belongsToList(Object obj) { 
    return Arrays.stream(classes).filter(c -> c.isInstance(obj)).findFirst().isPresent(); 
} 

Внутренне обработка завершается/возвращается при первом совпадении, поэтому это эффективно.

+0

это будет работать на Java 7 и 6, а? – kuranes

+0

@andreadoli no. для этого требуется java 8 (который отсутствовал почти 2 года) – Bohemian

0

Нет никакого способа без итерации массива классов каким-либо образом (с классическим циклом или потоком Java 8). Вы chould сделать так:

public static boolean belongsToList(Class<?> obj){ 
    for (Class<?> clazz : classes) { 
     if (clazz.isAssignableFrom(obj)) { 
      return true; 
     } 
    } 
    return false; 
} 

Или в случае, вам нужно знать, если OBJ является экземпляр класса:

public static boolean belongsToList(Object obj){ 
    for (Class<?> clazz : classes) { 
     if (clazz.isInstance(obj)) { 
      return true; 
     } 
    } 
    return false; 
} 
0

Вы можете использовать instanceof оператор вместо

boolean belongsToList(Object my_obj) { 
    for (Object o : classes) { 
     if (my_obj instanceof o) 
      return true; 
    } 
    return false; 
} 
Смежные вопросы