В общем, вы не можете этого сделать. Коллекция может быть пуста или составлена, например, из нулевых значений. Кроме того, как насчет интерфейсов? могут быть несколько интерфейсов, которые являются общими для всех элементов коллекции.
Однако, может быть, один из следующих будет полезно в вашем случае:
1) Анализируя содержимое коллекции: Если предположить, что сбор не является пустым, просканировать все элементы коллекции и найти их наименьший общий предка в иерархии классов.
2) Получение родового объявленный типа: Если объект вы осматривая объявлен как член данных (дженерик) некоторый класса, вы можете оценить его заявленный универсальный тип во время выполнения, используя отражение (см Field.getGenericType())
- EDIT -
Только для занятий, я осуществил самую низкую общую полезность предка:
public static Class<?> getLCA(Collection<?> c) {
Class<?> res = null;
for (Object obj : c)
if (obj != null) {
Class<?> clazz = obj.getClass();
res = (res == null)? clazz : getLCA(res, clazz);
}
return res;
}
private static Class<?> getLCA(Class<?> classA, Class<?> classB) {
if (classA.isAssignableFrom(classB))
return classA;
if (classB.isAssignableFrom(classA))
return classB;
while (!classA.isAssignableFrom(classB))
classA = classA.getSuperclass();
return classA;
}
Эффективность: O (п * ч), где п является размер коллекции и h - максимальная глубина элементов коллекции в иерархии классов.
зачем вам это? Можете ли вы объяснить на примере? –