Вы передаете результат self.read в целевой аргумент Thread. Thread ожидает, что будет передана функция для вызова, поэтому просто удалите скобки и не забудьте запустить Thread:
t1=threading.Thread(target=self.read)
t1.start()
print "something"
Общее правило, которое применяется здесь, следующее: если одна сигнатура метода строго более конкретна , чем другая, тогда 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).
blockquote>
4,10. Подтипирование
4.10.1.
float> 1 long
long> 1 int
blockquote>
Как упоминалось в этом ответе , при выборе того, какой перегруженный метод следует использовать, следуют правила.
Цитировать:
blockquote>
- Примитивное расширение использует наименьший аргумент метода
- Тип обложки не может быть расширен до другого типа Wrapper
- Вы можете вставить из int в Integer и расширить до Object, но не до Long
- Расширение бьет Бокс, Бокс побеждает Вар-арг.
- Вы можете вставить и затем Widen (Int может стать объектом через Integer)
- Вы не можете Widen, а затем Box (
- Вы не можете комбинировать 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. Таким образом, это вызовет ошибку компиляции.Надеюсь, это поможет вам понять, что происходит.