Как поведение NULL при следующей перегрузке метода в нижнем коде [duplicate]

Почему вы не должны и , когда вы должны использовать регулярные выражения?

Во-первых, обычное неправильное выражение: регулярные выражения не предназначены для «синтаксического анализа» ] HTML. Regexes может, однако, «извлечь» данные. Извлечение - это то, для чего они созданы. Основным недостатком выработки HTML-выражения в правильных инструментариях SGML или базовых синтаксических анализаторов XML является их синтаксическое усилие и различная надежность.

Считайте, что создание несколько надежного HTML-выражения regex:

]+id="(\d+)".+?    ]+href="(http://[^">]+)"[^>]*>([^<>]+).+?

является менее читаемым, чем простой эквивалент phpQuery или QueryPath:

$div->find(".stationcool a")->attr("title");

Существуют, однако, конкретные варианты использования, в которых они могут помочь.

  • Многие интерфейсы обхода DOM не показать комментарии HTML (.+?)/ и обработать остаток, используя более простые интерфейсы парсера HTML.

    Примечание. У меня на самом деле есть это приложение , где я использую разбор XML и регулярные выражения альтернативно. На прошлой неделе разразился синтаксический анализ PyQuery, и регулярное выражение все еще работало. Да, странно, и я не могу объяснить это сам. Но так получилось. Поэтому, пожалуйста, не голосуйте за реальные соображения, потому что это не соответствует регулярному выражению = evil mem. Но давайте также не будем проголосовать за это слишком много. Это всего лишь побочный сигнал для этой темы.

106
задан Jon Skeet 13 December 2015 в 18:50
поделиться

7 ответов

Java всегда будет пытаться использовать наиболее подходящую версию доступного метода (см. JLS §15.12.2 ).

Object, char[] и Integer могут принимать null в качестве действительного значения. Поэтому все 3 версии применимы, поэтому Java придется найти наиболее конкретный.

Поскольку Object является супертипом char[], версия массива более специфична, чем Object -версия. Поэтому, если существуют только эти два метода, будет выбрана версия char[].

Если доступны версии char[] и Integer, то оба они более специфичны, чем Object, но ни один более конкретный, чем другой, поэтому Java не может решить, какой из них вызывать. В этом случае вам придется явно указать, какой из них вы хотите вызвать, отвечая аргумент соответствующему типу.

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

Напротив , следующий вызов будет совершенно однозначным:

char[] x = null;
doSomething(x);

Хотя вы все еще передаете значение null, Java точно знает, какой метод вызывать, поскольку он учитывает тип переменной .

178
ответ дан Jake Millington 28 August 2018 в 19:06
поделиться

Каждый класс в Java расширяет класс Object. Еще один класс Integer также расширяет Object. Следовательно, Object и Integer рассматриваются как экземпляр объекта. Поэтому, когда вы передаете значение null в качестве параметра, а компилятор запутывается, какой метод объекта вызывается, например, с параметром Object или параметром Integer, поскольку оба они являются объектами, а их ссылка может быть нулевой. Но примитивы в java не расширяют Object.

2
ответ дан Ankit 28 August 2018 в 19:06
поделиться

существует двусмысленность из-за doSomething (char [] obj) и doSomething (Integer obj).

char [] и Integer оба одинаковы выше для null, поэтому они двусмысленны.

0
ответ дан chitrendra chaudhary 28 August 2018 в 19:06
поделиться

Я пробовал это, и когда есть только одна пара перегруженных методов, и один из них имеет тип объекта Object, тогда компилятор всегда будет выбирать метод с более конкретным типом. Но когда существует более одного определенного типа, компилятор выдает ошибку неоднозначного метода.

Поскольку это событие времени компиляции, это может произойти только тогда, когда один намеренно передает null этому методу. Если это сделано намеренно, тогда лучше перегрузить этот метод снова без параметров или вообще создать другой метод.

1
ответ дан ItamarG3 28 August 2018 в 19:06
поделиться

Каждая пара этих трех методов является двусмысленной сама по себе при вызове с аргументом null. Поскольку каждый тип параметра является ссылочным типом.

Ниже перечислены три способа вызова одного вашего метода с нулевым значением.

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

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

37
ответ дан jmg 28 August 2018 в 19:06
поделиться

null является допустимым значением для любого из трех типов; поэтому компилятор не может решить, какую функцию использовать. Вместо этого используйте что-то вроде doSomething((Object)null) или doSomething((Integer)null).

4
ответ дан Lars Noschinski 28 August 2018 в 19:06
поделиться
class Sample{
  public static void main (String[] args) {
       Sample s = new Sample();
       s.printVal(null);

    } 
    public static void printVal(Object i){
        System.out.println("obj called "+i);
    }

    public static void printVal(Integer i){
        System.out.println("Int called "+i);
    }
}

Вывод Int называется NULL, и поэтому неопределенность с char [] и Integer

0
ответ дан nagarjuna chimakurthi 28 August 2018 в 19:06
поделиться
Другие вопросы по тегам:

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