Неоднозначное поведение в Java [duplicate]

Вы передаете результат self.read в целевой аргумент Thread. Thread ожидает, что будет передана функция для вызова, поэтому просто удалите скобки и не забудьте запустить Thread:

t1=threading.Thread(target=self.read)
t1.start()
print "something"
65
задан Jonathan Leffler 26 July 2015 в 03:11
поделиться

2 ответа

Общее правило, которое применяется здесь, следующее: если одна сигнатура метода строго более конкретна , чем другая, тогда Java выбирает ее без ошибок.

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

Когда представлен выбор между сигнатурами sum(int... args) и sum(double... args), подпись sum(int... args) более конкретна, поскольку любое обращение к этому методу также может быть передано на sum(double... args) путем применения расширяющегося преобразования. То же самое не выполняется для метода sum(boolean... args), который нельзя преобразовать аналогичным образом.

Спецификация языка Java, версия SE 8:

15.12. Выражения вызова метода

15.12.2.5. Выбор наиболее конкретного метода

Язык программирования Java использует правило, выбранное наиболее специфичным методом.

...

Один применимый метод m1 более конкретный, чем другой применимый метод m2, для вызова с выражениями аргументов e1, ..., ek, если выполнено одно из следующих утверждений:

...

  • m2 не является общим, а m1 и m2 применимы строгим или свободным вызовом и где m1 имеет формальные типы параметров S1, ..., Sn и m2 имеет формальные типы параметров T1. .., Tn, тип Si является более конкретным , чем Ti для аргумента ei для всех i (1 ≤ i ≤ n, n = k).

. ..

Тип S более специфичен, чем тип T для любого выражения, если S & lt ;: T (§ 4.10).


4,10. Подтипирование

4.10.1.

float> 1 long

long> 1 int

53
ответ дан Marko Topolnik 24 August 2018 в 21:09
поделиться

Как упоминалось в этом ответе , при выборе того, какой перегруженный метод следует использовать, следуют правила.

Цитировать:

  1. Примитивное расширение использует наименьший аргумент метода
  2. Тип обложки не может быть расширен до другого типа Wrapper
  3. Вы можете вставить из int в Integer и расширить до Object, но не до Long
  4. Расширение бьет Бокс, Бокс побеждает Вар-арг.
  5. Вы можете вставить и затем Widen (Int может стать объектом через Integer)
  6. Вы не можете Widen, а затем Box (
  7. Вы не можете комбинировать var-args с расширением расширения и .

(Давайте переопределим правило 1 следующим образом: «Примитивное расширение использует максимально возможный аргумент метода .»)

Таким образом, имея в виду эти правила, мы можем получить идея о том, что здесь происходит:

Согласно правилу номер один, примитивное расширение использует максимально возможный аргумент метода , Поскольку int представляет нечетное число (например, 1), а double представляется десятичным числом с точностью более 32 байт, чем число float (например, 1.0), мы можем сказать, что int s «меньше» или «меньше» double s, и по этой логике int s может быть «продвинуто» до double s, а double s может быть " demoted "на int s.

Проще говоря, примитив, который может быть расширен до другого примитива (например, int -> float -> double), является более конкретным , чем другой. Например, int является более конкретным , чем double, потому что 1 может быть повышен до 1.0.

Если вы не передали аргументы этим перегруженным vararg методы с тем же именем, так как возврат фактически тот же (0 и 0.0 соответственно), компилятор решил использовать метод, который принимает vararg типа int, поскольку он более конкретный .

Итак, когда вы ввели те же методы, что и в int s и boolean s (типы, которые не могут быть расширены друг к другу) соответственно, компилятор теперь не может выбрать метод для использования, поскольку int s не может «продвигаться» или «понижаться в должности» подобно int s, float s и double s. Таким образом, это вызовет ошибку компиляции.

Надеюсь, это поможет вам понять, что происходит.

7
ответ дан Community 24 August 2018 в 21:09
поделиться
Другие вопросы по тегам:

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