Если таблицы 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; - Примечание: исключить .
из обратных тиков.
Общее решение - использовать разные имена. Эти методы могут быть в классах без отношения наследования, поскольку они не являются методами экземпляра.
Как указано, реализация метода в вопросе одинаков (опечатка исключена).
(Эта проблема с перегрузкой часто путается с стиранием типов времени выполнения. Перегрузка - это время связи, а не динамическая проблема, поэтому ее можно легко фиксировать на языке. Это просто не особенно полезное изменение, и не очень хорошая идея поощрять перегрузку.)
Помимо проблемы одной и той же реализации здесь основная проблема заключается в том, что несколько варварский «метод A и метод B имеют одно и то же стирание».
Что делает этот вопрос сложным, так это то, что мы, как правило, не знаем (по крайней мере, не этим утром) много знаем о «тире стирания».
Чтобы сделать это коротко:
Параметрические типы выполняют проверку типа во время компиляции (для обеспечения правильности ввода), но забудьте о своих параметрах типа во время выполнения (чтобы избежать генерации базовых методов).
blockquote>звучит в то же время просто и загадочно. Лучший способ понять это - обратиться к следующей литературе:
- Что такое повторно идентифицируемый тип?
- Как и под каким
- Есть ли у вас какие-либо идеи / примеры того, что это может означать в моей жизни кодирования?
- 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)
.
Проверьте настройку проекта и версию компилятора проекта. Щелкните правой кнопкой мыши по проекту -> Свойства -> Компилятор Java. Убедитесь, что настройка соответствия обновлена. У меня была эта проблема, когда параметры соблюдения были установлены на 1.4 вместо 1.6