У меня была та же проблема, когда я отправил данные с помощью jQuery AJAX:
$.ajax({
url:...
success:function(data){
//server response's data is JSON
//I use jQuery's parseJSON method
$.parseJSON(data);//it's ERROR
}
});
Если ответом является JSON, и вы используете этот метод, данные, которые вы получаете, являются объектом JavaScript, но если вы используйте dataType:"text"
, данные - строка JSON. Тогда использование $.parseJSON
в порядке.
Проблема с алмазом применима только к реализации inheritance (extends
во всех версиях Java до Java 8). Это не относится к API inheritance (implements
во всех версиях Java до Java 8).
Поскольку методы интерфейса с сигнатурами типа соответствия совместимы, нет алмаз, если вы наследуете одну и ту же подпись метода в два раза: подписи сигнатур метода просто сливаются. (И если сигнатуры типа не совпадают, то у вас также нет проблемы с алмазом.)
В Java 7 и ниже единственный способ наследовать реализацию код был через ключевое слово extends
, которое ограничивает не более одного родителя. Поэтому нет наследования множественной реализации и проблемы с алмазом не существует.
Java 8 добавляет новую морщину, потому что она позволяет интерфейсам иметь код реализации. Он все еще избегает проблемы с алмазом, просто отступая от предыдущего поведения (без наследования реализации), когда вы реализуете несколько интерфейсов с методами, имеющими соответствующие подписи.
Чтобы добавить к существующим ответам о множественном наследовании Java8 с интерфейсами (так же, как Java все еще избегает проблемы с алмазом):
Существует три правила:
Java преодолевает эту проблему, даже если интерфейсы могут иметь стандартные реализации методов, потому что реализация по умолчанию либо однозначная (одна в классе A
), либо ситуация разрешена некоторыми правило (когда класс B
или класс C
переопределяет реализацию из класса A
, см. ниже).
Когда супертипы класса или интерфейса предоставляют несколько методов по умолчанию с помощью та же подпись:
Однако , если конфликтуют два или более независимых метода по умолчанию или метод по умолчанию конфликтует с абстрактным методом , тогда компилятор Java создает ошибку компилятора. Вы должны явно переопределить методы супертипа . В этом случае вы можете вызывать любую из реализаций по умолчанию с ключевым словом super.
При использовании методов по умолчанию в интерфейсе, введенных в Java 8, может возникнуть проблема с несколькими наследованиями, существует 3 сценария -
1- Если реализация класса переопределяет метод по умолчанию и предоставляет свои собственные функции для метода по умолчанию то метод класса имеет приоритет над методами интерфейса по умолчанию.
2-Когда класс реализует оба интерфейса, и оба имеют одинаковый метод по умолчанию, также класс не переопределяет этот метод, тогда ошибка будет выбрана .
3. Если интерфейс расширяет другой интерфейс и оба имеют один и тот же метод по умолчанию, метод по умолчанию наследующего интерфейса будет иметь приоритет.
читайте больше об этом здесь .
Java не поддерживает множественное наследование, поэтому проблема с алмазом не возникает. Если B & amp; C - интерфейсы, то в интерфейсах нет реализации. Даже если B & amp; C переопределяет метод в интерфейсе A (не может быть классом), методы будут иметь одну и ту же подпись. Нет никакой двусмысленности в отношении того, какую реализацию использовать, потому что нет реализации.
IncompatibleClassChangeError: Conflicting default methods
, если оба варианта B и C имеют реализацию по умолчанию, а D не отменяет. Это как ошибка компиляции, так и ошибка времени выполнения. – Andreas 26 January 2017 в 18:30