Я пытаюсь понять, как работает перегрузка в JAVA и пытается понять различные правила перегрузки, которые применяются в случае расширения, автобоксинга и varargs в JAVA. Я не в состоянии понять, что происходит в следующем сценарии:Метод неоднозначен для типа Ошибка
package package1;
public class JustAClass {
public static void add(int a, long b) {
System.out.println("all primitives");
}
//public static void add(Integer a, long b) {
// System.out.println("Wraper int, primitive long");
//}
public static void add(int a, Long b) {
System.out.println("Primitive int, Wrapper long");
}
public static void add(Integer a, Long b){
System.out.println("All wrapper");
}
public static void main(String[] args) {
int a = 10;
Integer b = 10;
long c = 9;
Long d = 9l;
add(a,c);
add(a,d);
add(b,c);
add(b,d);
}
}
На данный момент, я получаю ошибку компиляции на третьем вызове метода add
говоря The method is ambiguous for the type Error
. Почему это так? Каковы правила определения того, какой вызов метода будет работать? Что именно происходит в следующем случае? Я чувствую, что fourth
перегруженный метод добавления должен работать. Пожалуйста, помогите мне понять концепцию этого.
Правила указаны в Спецификациях Java Language, и они чрезвычайно длинны и сложны. Помнить их в принципе невозможно, и именно поэтому вы никогда не должны писать код, как указано выше, потому что вы можете почти наверняка ввести ошибки. Я уважаю ваше желание понять, но для этого вам следует прочитать JLS: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12 –
@JBNizet : Я думаю, что вопрос полностью закончен. Вы можете узнать спецификацию, разбив ее и понять, почему она ломается, а затем никогда не делайте этого снова. – kiltek