Согласно выходному сигналу компилятора, в обоих примерах сигнатуры методов различны (скомпилируйте код с опцией -Xlint:unchecked
, чтобы подтвердить его):
getSupplier() in A (m2)
1st snippet
getSupplier() in B (m1)
getSuppliers(Collection strings) in A (m2)
2nd snippet
getSuppliers(Collection strings) in B (m1)
Согласно JLS , сигнатура метода m1 является поднайбой подписи сигнатуры метода m2, если либо:
blockquote>
- m2 имеет ту же подпись, что и m1 , или
- подпись m1 такая же, как стирание подписи m2.
Первое утверждение выходит из игры - метод подписи разные. Но как насчет второго утверждения и стирания?
Valid Override
B.getSupplier()
(m1) является подъявлениемA.
(m2), потому что:getSupplier() blockquote>
- подпись m1 такая же, как стирание сигнатуры m2
после стирания равно
getSupplier() getSupplier()
.Недопустимое переопределение
B.getSuppliers(...)
(m1) не является поднаклейкойA.
(m2), потому что:getSuppliers(...) blockquote>
- подпись m1 не совпадает с стиранием сигнатуры m2
Подпись m1:
getSuppliers(Collection
strings); Утечка сигнатуры m2 :
getSuppliers(Collection strings);
Изменение аргумента m1 от
Collection
до необработанногоCollection
устраняет ошибку, в этом случае m1 становится поднаклейкой m2.Заключение
1-й фрагмент кода (действительный переопределение) : сигнатуры метода в родительском и дочернем классах отличаются изначально. Но после применения стирания к родительскому методу подписи становятся одинаковыми.
2-й фрагмент кода (недопустимое переопределение) : сигнатуры метода первоначально отличаются и остаются разными после применения стирать родительский метод.
Вы не можете оценить JavaScript в Jinja. Вы пытаетесь создать URL-адрес на стороне сервера, в то время как Jinja выполняет рендеринг, но вы ссылаетесь на переменную, которая доступна только в JavaScript, запущенном в клиентском браузере.
Создание URL-адреса клиента сторона является самым простым исправлением. (Я не знаю, как выглядит ваш маршрут, так что вот пример.)
$('#demo').load('/url/for/addshare2/' + variable1);
Однако это не очень полезно, потому что вы не можете использовать url_for
, поэтому вам нужно hard-code url. Это хороший признак того, что вы хотите, чтобы конечная точка AJAX передавала параметры, а не конечную точку, которая содержит значения.
@app.route('/addshare2', methods=['POST'])
def addshare2():
share = request.json['share']
...
return jsonify(result=...)
Теперь вы можете сгенерировать URL с url_for
и пройти параметры как данные формы.
$.post(
'{{ url_for('addshare2') }}',
{share: variable1},
function (data) {
// do something with data on successful response
}
);
Иногда я использую следующее обходное решение с временной строкой-заполнителем:
var variable1 = "someString";
$('#demo').load(
"{{ url_for('addshare2', share='ADDSHARE2') }}".replace("ADDSHARE2", variable1)
);
Это не совсем правильно, и я все еще ищу лучшее решение. Но он выполняет эту работу.