0
Why this code give ambiguous method error?
class Main { public static void main(String[ ] args) { Hello h=new Hello(); h.show(null); } } class Hello { void show(String s) { System.out.println("String method"); } void show(Object[ ] s) { System.out.println("Object method"); } }
22 Answers
+ 2
In java, there are 2 different types:
1. Primitive (or value) type which holds a specific value
2. Reference type which holds the reference (address) to the value stored in memory.
In your example, both string and object array are considered as reference types.
Quoted from http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.1
"There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type.
The null reference can always be assigned or cast to any reference type (§5.2, §5.3, §5.5).
In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type."
Hence, when you try to invoke your show(null) method, the compiler doesnt understand which actual overloaded method you're trying to use because null can be casted to any reference type, thus the ambiguous error.
Hope this helps.
+ 2
Not sure, but probably because String IS an Object.
+ 1
@AKC @HeroesKiller
In the end , we all have the same understanding but maybe @pavansingh misunderstood null type as regular string literal
+ 1
@HeroesKiller string is an object. If you evaluate if (string instanceof object) i believe it will return true.
+ 1
@Heroes Killer sorry, i misunderstood your statement earlier. But i think you're right :).
@Paven anyhow, we should not try to code something that'll cause ambiguity from the compiler and the reader. :)
+ 1
As AKC said, String does not inherit from Object[].
java.util.Object is a parent class.
Object[] is a child class, that extends Object class.
String is also a child class, that extends Object class, but not Object[] class.
Both String and Object[] are children of Object, but neither of them is child of each other. :D
0
Because String is an object and null can not be identified as String or object so theres a problem with your method parameters in hello
0
but here null is treated as literal.
0
Please post the detailed exception stacktrace
0
You are passing null as a pointer to nowhere, it cannot be considered as an object. If you want to pass it as a string, you need to call h.show("null");
0
but if we comment any one show method in Hello class then it's run fine.just try and then after give the answer.....
0
@AKC: I know, just tried to explain it a little differently.
@ pavan singh: In this case, null can be considered both as a String and Object array. That's why commenting one of methods helps. It's NOT String or Object, but both types can have a reference to nowhere - null.
0
I think you did not get the point of all three given answers. You have 2 methods show() and the value took to execute is null. In this case the Environment could execute both of them. Because String is an object aswell you can assign them null, too. But in Java the environment always has to know precisly what it has to do. This is the case if every call belongs to a single identificable method header. And this is exactly the problem
For the parameter value null you can not identify the method which should be executed
0
sry @Heroeskiller I am a little bit frustrated from being copied so often. Because I can not see the sense in it. But you are right describing it in another way is a good option.
0
@AKC: No problemo, I know that feel as well. :D
In the last case, all three of us replied at once with practically same answer. ^^
0
@heros killer: if we take Object type argument instead of Object [ ] type in method show then what's the o/p....
0
kk frnds why this code not give ambiguous method error.....
class Main
{
public static void main(String[ ] args)
{
Hello h=new Hello();
h.show(null);
}
}
class Hello
{
void show(String s)
{
System.out.println("String method");
}
void show(Object s)
{
System.out.println("Object method");
}
}
0
Nevertheless, it seems he still miss the point. :D
I said Object array. That thing, which is passed to the method (an argument) is just a reference. Reference of any type. And all you do is setting that reference to nowhere, which you can do with any reference.
0
@Corsair Alex: I know, it is a class that extends the java.lang.Object class. Just wasn't sure if that's the reason. =)
0
but Object [ ] ref is also Object type and extends by String class