Проблемы с пониманием java this. & Lt; Parametrized & gt; field [duplicate]

- он завершен - нет ошибки

    SET SERVEROUTPUT ON SIZE 100000

DECLARE
   v_match_count     INTEGER;
   v_counter         INTEGER;




v_owner           VARCHAR2 (255) := 'VASOA';
v_search_string   VARCHAR2 (4000) := '99999';
v_data_type       VARCHAR2 (255) := 'CHAR';
v_sql             CLOB := '';

BEGIN
   FOR cur_tables
      IN (  SELECT owner, table_name
              FROM all_tables
             WHERE     owner = v_owner
                   AND table_name IN (SELECT table_name
                                        FROM all_tab_columns
                                       WHERE     owner = all_tables.owner
                                             AND data_type LIKE
                                                       '%'
                                                    || UPPER (v_data_type)
                                                    || '%')
          ORDER BY table_name)
   LOOP
      v_counter := 0;
      v_sql := '';

      FOR cur_columns
         IN (SELECT column_name, table_name
               FROM all_tab_columns
              WHERE     owner = v_owner
                    AND table_name = cur_tables.table_name
                    AND data_type LIKE '%' || UPPER (v_data_type) || '%')
      LOOP
         IF v_counter > 0
         THEN
            v_sql := v_sql || ' or ';
         END IF;

         IF cur_columns.column_name is not null
         THEN
            v_sql :=
                  v_sql
               || 'upper('
               || cur_columns.column_name
               || ') ='''
               || UPPER (v_search_string)||'''';

            v_counter := v_counter + 1;
         END IF;

      END LOOP;

      IF v_sql is  null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name;

      END IF;

      IF v_sql is not null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name
            || ' where '
            || v_sql;
      END IF;

      --v_sql := 'select count(*) from ' ||v_owner||'.'|| cur_tables.table_name ||' where '||  v_sql;


      --dbms_output.put_line(v_sql);
      --DBMS_OUTPUT.put_line (v_sql);

      EXECUTE IMMEDIATE v_sql INTO v_match_count;

      IF v_match_count > 0
      THEN
        DBMS_OUTPUT.put_line (v_sql);
        dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
      END IF;

   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (
            'Error when executing the following: '
         || DBMS_LOB.SUBSTR (v_sql, 32600));
END;
/
15
задан Johann-Christoph Jacob 9 May 2010 в 18:17
поделиться

4 ответа

Я никогда не использовал это на практике, но вы можете себе представить, как использовать это для безопасности типов. Рассмотрим следующий метод:

<T> void method(T... items) {
    List<T> list = new ArrayList<T>();
    for (T item : items)
        list.add(item);
    System.out.println(list);
}

Вы можете назвать это следующим образом:

o.<Object>method("Blah", new Long(0));
o.<Number>method(new Integer(100), new Long(0));

Но это вызовет ошибку компилятора:

o.<Number>method("String", new Long(0));

Таким образом, у вас есть общий метод, который является типичным и может использоваться для каждого объекта, не ограничиваясь парикулярным интерфейсом или классом.

14
ответ дан Arne 19 August 2018 в 13:50
поделиться
  • 1
    отличный ответ, особенно использование varargs – Johann-Christoph Jacob 9 May 2010 в 18:18

Например, когда вам нужен какой-то метод universal для сравнения:

public static <T extends Comparable> T max(T one, T two) {
    if (one.compareTo(two) > 0) {
        return one;
    } else {
        return two;
    }
}
1
ответ дан Aleksejs Mjaliks 19 August 2018 в 13:50
поделиться
  • 1
    Предполагая, что этот метод является членом класса Aggregator, а параметр обобщенного типа T добавляется в Comparable в объявление, я могу назвать его просто как Aggregator.max (новый Integer (5), новый Integer (10)); Никаких параметров, необходимых для вызова. – Johann-Christoph Jacob 6 May 2010 в 16:08
  • 2
    вы не выполняете параметризованный вызов метода в любом месте этого кода – newacct 6 May 2010 в 18:47
  • 3
    Да, согласитесь. Не нужно дополнительно указывать класс. – Aleksejs Mjaliks 6 May 2010 в 22:46

Это, вероятно, наиболее полезно, когда вы берете коллекцию некоторого типа и возвращаете некоторое подмножество этой коллекции.

<T> List<T> filter(Collection<? extends T> coll, Predicate<? super T> pred) {
    List<T> returnList = new ArrayList<T>();
    for(T t : coll) {
        if(pred.matches(t)){
            returnList.add(t);
        }
    }
    return returnList;
}

Edit:

В более общем плане , это полезно, когда вы хотите вернуть определенный тип, или хотите связать типы двух или более параметров в общем виде.

8
ответ дан ILMTitan 19 August 2018 в 13:50
поделиться
  • 1
    вы не выполняете параметризованный вызов метода в любом месте этого кода – newacct 6 May 2010 в 18:47

Параметрированные вызовы методов полезны, если вы хотите разрешить разные типы без кастования. Например, вспомогательный класс Collections широко использует вызовы параметризованных методов. Если вы хотите создать новую общую коллекцию, используя один из своих вспомогательных методов, несколько примеров:

List<String> anEmptyStringList = Collections.<String>emptyList();
Set<Integer> unmodifiableCopy = Collections.<Integer>unmodifiableSet(originalSet);

Итак, если вы хотите использовать общий тип в другом месте, вы хотите использовать эти вызовы методов. Они предотвращают предупреждения компилятора при использовании дженериков.

13
ответ дан justkt 19 August 2018 в 13:50
поделиться
  • 1
    Разве это не тип коллекции, выведенный из объявления переменных? – Johann-Christoph Jacob 6 May 2010 в 15:32
  • 2
    Вы получите предупреждение о броске от компилятора (если вы не отключили его), если вы выполняете List<String> anEmptyStringList = Collections.emptyList() без параметра в вызове. Фактически, я впервые узнал об этом от коллеги, который показывал мне, как избавиться от предупреждения. – justkt 6 May 2010 в 15:35
  • 3
    Я не могу воспроизвести это предупреждение в моей настройке. Даже с параметром -Xlint. Вероятно, это связано с различиями в компиляторах. Я использую javac 1.6.0_20 от Sun JDK в Linux. – Johann-Christoph Jacob 6 May 2010 в 16:02
  • 4
    Я почти уверен, что компилятор никогда не выдаст этого предупреждения, что называется «пустым списком» таким образом. Я включил предупреждения для дженериков и не получаю предупреждение. – Arne 6 May 2010 в 16:06
  • 5
    Обратите внимание, что проблема @ user1084563 относится к фиксированной с Java 8 (подтвержденной openjdk-8-jdk-headless_8u111-b14-2 ~ bpo8 + 1_amd64.deb и zulu8.19.0.1-jdk8. 0.112-win_x64.zip). – Johann-Christoph Jacob 18 January 2017 в 21:50
Другие вопросы по тегам:

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