Из перегружаемых операторов могут быть перегружены следующие операторы:
+, -, !, ~, ++, --, true, false
+, -, *, /, %, &, |, ^, <<, >>
==, !=, <, >, <=, >=
И эти операторы не могут быть перегружены:
&&, ||
[]
(T)x
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof
Кроме того, операторы сравнения должны быть перегружены попарно Если вы перегружаете одну, вы должны перегрузить другую:
==
и !=
<
и >
<=
и >=
Если я правильно помню, когда я готовил scjp, в первом случае у вас есть 2 аргумента без связи между ними, поэтому компилятор не может выбрать один.
во-вторых, при включенном боксе (1.5+) int может быть Integer, который является подмножеством Object, и компилятор в случае конфликта всегда будет использовать наиболее конкретное определение. Таким образом, приоритет отдается Integer (int).
Java всегда будет использовать ближайший возможный тип, поэтому, когда вы передаете int в метод, если у вас нет int .. .., он автоматически упаковывает их в целые числа и использует Object .... Поскольку существует метод int ..., Java будет использовать его в первую очередь. Это выбор в дизайне компилятора Java.