Java: Instanceof и Generics

Код читается тремя объектами: компьютер, программист, и в конечном счете специалист по обслуживанию.
Стиль и Форматирование не важны компьютеру, возможно важны для программиста, но это, конечно, важно для специалиста по обслуживанию, который должен попытаться постигать функциональность программы.
Отказ разместить других разработчиков путем создания кода читаемым непочтителен.
Создание организовало код со значимыми именами переменной, и комментарии форма общей любезности кому-либо еще, кто читает его.

126
задан Nathan Kleyn 13 April 2013 в 21:03
поделиться

3 ответа

В сообщении об ошибке сказано все. Во время выполнения тип пропал, проверить его невозможно.

Вы можете поймать его, создав фабрику для вашего объекта следующим образом:

 public static <T> MyObject<T> createMyObject(Class<T> type) {
    return new MyObject<T>(type);
 }

А затем в конструкторе объекта сохраните этот тип, поэтому переменную чтобы ваш метод мог выглядеть так:

        if (arg0 != null && !(this.type.isAssignableFrom(arg0.getClass()))
        {
            return -1;
        }
76
ответ дан 24 November 2019 в 00:55
поделиться

Технически в этом не должно быть необходимости, в этом суть дженериков, поэтому вы можете выполнять проверку типа компиляции:

public int indexOf(E arg0) {
   ...
}

, но тогда @Override может стать проблемой, если у вас есть иерархия классов.

1
ответ дан 24 November 2019 в 00:55
поделиться

Тип среды выполнения объекта - это относительно произвольное условие для фильтрации. Я предлагаю держать такую ​​грязь подальше от вашей коллекции. Это просто достигается путем передачи вашей коллекции делегата фильтру в конструкции.

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;
             }
         }}
     );
1
ответ дан 24 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: