Статический метод переопределения (?) С дженериками дает ошибку столкновения [дубликат]

Если таблицы cols и значения являются переменными, то существует два способа:

С двойными кавычками "" полный запрос:

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

Или

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

С одинарными кавычками '':

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

Использовать обратные тики ``, когда имя столбца / значения похоже на зарезервированное ключевое слово MySQL.

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

`table_name`. `column_name` & lt; - Примечание: исключить . из обратных тиков.

18
задан Ar3s 26 December 2013 в 16:40
поделиться

3 ответа

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

Как указано, реализация метода в вопросе одинаков (опечатка исключена).

(Эта проблема с перегрузкой часто путается с стиранием типов времени выполнения. Перегрузка - это время связи, а не динамическая проблема, поэтому ее можно легко фиксировать на языке. Это просто не особенно полезное изменение, и не очень хорошая идея поощрять перегрузку.)

6
ответ дан Tom Hawtin - tackline 26 August 2018 в 07:24
поделиться

Общий ответ:

Помимо проблемы одной и той же реализации здесь основная проблема заключается в том, что несколько варварский «метод A и метод B имеют одно и то же стирание».

Что делает этот вопрос сложным, так это то, что мы, как правило, не знаем (по крайней мере, не этим утром) много знаем о «тире стирания».

Чтобы сделать это коротко:

Параметрические типы выполняют проверку типа во время компиляции (для обеспечения правильности ввода), но забудьте о своих параметрах типа во время выполнения (чтобы избежать генерации базовых методов).

звучит в то же время просто и загадочно. Лучший способ понять это - обратиться к следующей литературе:

  1. Что такое повторно идентифицируемый тип?
  2. Как и под каким
  3. Есть ли у вас какие-либо идеи / примеры того, что это может означать в моей жизни кодирования?
  4. Well это странно, и мне это не очень нравится, но мне любопытно, почему они это сделали ...

Надеюсь, что это поможет вам, насколько это мне помогло.

Конкретный ответ:

В вашем случае

public abstract class ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassA> list) {
        //do stuff
    }
}

public abstract class ClassB extends ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassB> list) {
        //do other stuff
   }
}

будет «преобразован» с помощью javac на

public abstract class ClassA {
    public static List createSensors(Collection list) {
        //do stuff
    }
}

public abstract class ClassB extends ClassA {
    public static List createSensors(Collection list) {
        //do other stuff
   }
}

, где один явно не может переопределить другой (не такой же параметр типа), но в то же время в точности совпадают во время выполнения (нет возможности для вашей программы выбрать, какой из них использовать).

Хватит этой проблемы, как решить его? Вы можете перейти к одному из следующих способов:

  • Использовать разные имена: createASensors и createBSensors этот подход является наиболее очевидным, но выглядит немного менее изящным.
  • Добавить параметр: createSensors(Collection<? extends ClassA> list, ClassA typeDefiner) этот подход может показаться варварским, но немного менее изящным, но используется в java.util.List для метода <T> T[] toArray(T[] a).
12
ответ дан Ar3s 26 August 2018 в 07:24
поделиться

Проверьте настройку проекта и версию компилятора проекта. Щелкните правой кнопкой мыши по проекту -> Свойства -> Компилятор Java. Убедитесь, что настройка соответствия обновлена. У меня была эта проблема, когда параметры соблюдения были установлены на 1.4 вместо 1.6

-1
ответ дан Asanka Siriwardena 26 August 2018 в 07:24
поделиться
Другие вопросы по тегам:

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