Я добавил три метода с параметрами:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
Когда я звоню doSomething(null)
, компилятор выдает ошибку как неоднозначные методы . Так это проблема , потому что Integer
и char[]
методы или Integer
и Object
методы?
java
oop
null
overloading
Фани
источник
источник
Integer
кint
.reference to doSomething is ambiguous
ошибке.Ответы:
Java всегда будет пытаться использовать наиболее конкретную применимую версию доступного метода (см. JLS §15.12.2 ).
Object
,char[]
иInteger
все они могутnull
быть допустимы. Следовательно, применимы все 3 версии, поэтому Java должна будет найти наиболее конкретную.Поскольку
Object
это супер-типchar[]
, версия массива более конкретна, чемObject
-version. Поэтому, если существуют только эти два метода,char[]
будет выбрана версия.Когда оба
char[]
иInteger
версии доступны, то обе они являются более конкретными , чем ,Object
но ни один не является более специфичным , чем другие, так что Java не может решить , какой из них позвонить. В этом случае вам нужно будет явно указать, какой из них вы хотите вызвать, приведя аргумент к соответствующему типу.Обратите внимание, что на практике эта проблема возникает гораздо реже, чем можно было бы подумать. Причина в том, что это происходит только тогда, когда вы явно вызываете метод
null
с переменной или с переменной довольно неспецифического типа (например,Object
).Напротив, следующий вызов был бы совершенно однозначным:
Хотя вы по-прежнему передаете значение
null
, Java точно знает, какой метод вызывать, поскольку он будет учитывать тип переменной.источник
Каждая пара из этих трех методов сама по себе неоднозначна при вызове с
null
аргументом. Поскольку каждый тип параметра является ссылочным типом.Ниже приведены три способа вызвать один ваш конкретный метод с помощью null.
Могу я предложить устранить эту двусмысленность, если вы действительно планируете вызывать эти методы с
null
аргументами. Такой дизайн предполагает ошибки в будущем.источник
Integer
-char[]
пара неоднозначна, так как в двух других случаях, Java компилятор может выбрать наиболее выбор конкретного, как описано @JoachimSauer.null
параметром as. При этом предварительном условии все три пары неоднозначны. В общем случае согласен, что толькоInteger - char[]
пара неоднозначна.doSomething(null)
дляpublic static void doSomething(String str) { System.out.println("String called"); }
Вернет строку с именем.null
является допустимым значением для любого из трех типов; поэтому компилятор не может решить, какую функцию использовать. Используйте что-нибудь вродеdoSomething((Object)null)
илиdoSomething((Integer)null)
вместо.источник
Каждый класс в Java расширяет класс Object, даже класс Integer также расширяет Object. Следовательно, как объект, так и целое число считаются экземпляром объекта. Поэтому, когда вы передаете null в качестве параметра, компилятор не понимает, какой метод объекта вызывать, т.е. с параметром Object или параметром Integer, поскольку они оба являются объектами, и их ссылка может быть нулевой. Но примитивы в java не расширяют Object.
источник
Я пробовал это, и когда есть ровно одна пара перегруженных методов, и один из них имеет тип параметра Object, тогда компилятор всегда будет выбирать метод с более конкретным типом. Но когда существует более одного конкретного типа, компилятор выдает ошибку неоднозначного метода.
Поскольку это событие времени компиляции, это может произойти только тогда, когда этому методу намеренно передается значение null. Если это сделано намеренно, лучше снова перегрузить этот метод без параметров или вообще создать другой метод.
источник
существует двусмысленность из-за doSomething (char [] obj) и doSomething (Integer obj).
char [] и Integer одинаково превосходят null, поэтому они неоднозначны.
источник
Результат - Int, называемый null, поэтому двусмысленность возникает с char [] и Integer.
источник