Универсальные типы параметров, такие как <String>
, существуют только во время компиляции и получат стирание типа , поэтому остается только Object
.
Хорошо, можно выбрать наиболее специализированный общий класс:
public Class<?> commonComponentClass(Collection<?> collection) {
Class<?> klazz = null;
for (Object item : collection) {
if (item == null)
continue;
Class<?> itemKlazz = item.getClass();
if (klazz == null) {
klazz = itemKlazz;
} else {
while (klazz != itemKlazz) {
if (itemKlazz.isAssignableFrom(klazz)) {
klazz = itemKlazz;
break;
} else if (klazz.isAssignableFrom(itemKlazz)) {
break;
}
if (itemKlazz != Object.class)
itemKlazz = itemKlazz.getSuperclass();
if (klazz != Object.class)
klazz = klazz.getSuperclass();
}
}
}
if (klazz == null) {
klazz = Object.class;
}
return klazz;
}