Java стирает информацию о типе для универсальных шаблонов после компиляции, поэтому вы не можете проверить параметр типа таким образом динамически.
Если все пути к этому коду ограничивают параметр типа, выполните следующие действия:
// Return true if object is a list of MyType, false if it is not a list, or is
// empty
boolean isListOfMyType(Object o) {
if (o instanceof List) {
List<?> l = (List<?) o;
return (l.size() > 0 && (l.get(0) instanceof MyType)
}
return true;
}
является типизированным, хотя он будет работать только в том случае, если список не пуст. Если нет, вам нужно будет изменить приведенное выше, чтобы проверить, все ли элементы проходят тест instanceof (или если они равны нулю, если вы разрешаете нули в своем списке).
Другой вариант - создать подкласс, который расширяет, скажем, ArrayList<MyType>
, и использовать его для вашей instanceof
проверки.
И последнее, но не менее важное: наличие подкласса, реализующего List<MyType>
, позволит вам получить параметр типа с помощью метода Class.getGenericInterfaces()
. Подробнее см. this.
Чтобы любой из этих двух последних методов работал, вы должны убедиться, что создание списка всегда создает экземпляр одного из этих типов. Т.е. если вызывающий абонент построит свой собственный ArrayList<MyType>
, это не сработает.
person
Dean Povey
schedule
10.02.2010