Код читается тремя объектами: компьютер, программист, и в конечном счете специалист по обслуживанию.
Стиль и Форматирование не важны компьютеру, возможно важны для программиста, но это, конечно, важно для специалиста по обслуживанию, который должен попытаться постигать функциональность программы.
Отказ разместить других разработчиков путем создания кода читаемым непочтителен.
Создание организовало код со значимыми именами переменной, и комментарии форма общей любезности кому-либо еще, кто читает его.
В сообщении об ошибке сказано все. Во время выполнения тип пропал, проверить его невозможно.
Вы можете поймать его, создав фабрику для вашего объекта следующим образом:
public static <T> MyObject<T> createMyObject(Class<T> type) {
return new MyObject<T>(type);
}
А затем в конструкторе объекта сохраните этот тип, поэтому переменную чтобы ваш метод мог выглядеть так:
if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass()))
{
return -1;
}
Технически в этом не должно быть необходимости, в этом суть дженериков, поэтому вы можете выполнять проверку типа компиляции:
public int indexOf(E arg0) {
...
}
, но тогда @Override может стать проблемой, если у вас есть иерархия классов.
Тип среды выполнения объекта - это относительно произвольное условие для фильтрации. Я предлагаю держать такую грязь подальше от вашей коллекции. Это просто достигается путем передачи вашей коллекции делегата фильтру в конструкции.
public interface FilterObject {
boolean isAllowed(Object obj);
}
public class FilterOptimizedList<E> implements List<E> {
private final FilterObject filter;
...
public FilterOptimizedList(FilterObject filter) {
if (filter == null) {
throw NullPointerException();
}
this.filter = filter;
}
...
public int indexOf(Object obj) {
if (!filter.isAllows(obj)) {
return -1;
}
...
}
...
}
final List<String> longStrs = new FilterOptimizedList<String>(
new FilterObject() { public boolean isAllowed(Object obj) {
if (obj == null) {
return true;
} else if (obj instanceof String) {
String str = (String)str;
return str.length() > = 4;
} else {
return false;
}
}}
);