Code:
public class Foo {
static void test(String s){
System.out.println("String called");
}
static void test(int s){
System.out.println("int called");
}
public static void main(String[] args) throws Exception {
test(5>8? 5:8); // Line 1
test(5>8? "he":"ha"); // Line 2
test(5>8? 5:"ha"); // Line 3
System.out.println(5<8? 5:"ha"); //Line 4
}
}
When I execute this code I get the following Error at Line 3
Foo.java:24: error: no suitable method found for test(INT#1)
test(5>8? 5:"ha"); // Line 3
^
Using similar type in the ternary operator does not give error. But using different types gives error only to the method call test(5>8? 5:"ha");
but it works for the call System.out.println(5<8? 5:"ha");
When I add another overloaded method static void test(Object s){}
, then the //Line 3
compiles.
Can anyone please explain me this scenario?
In essence, your answer says: "Yes, it's possible to use the ternary operator without assigning a variable. All you have to do is -- assign a variable."
The conditional (ternary) operator is the only JavaScript operator that takes three operands: a condition followed by a question mark ( ? ), then an expression to execute if the condition is truthy followed by a colon ( : ), and finally the expression to execute if the condition is falsy.
Java ternary operator is the only conditional operator that takes three operands. It's a one-liner replacement for the if-then-else statement and is used a lot in Java programming. We can use the ternary operator in place of if-else conditions or even switch conditions using nested ternary operators.
The ternary conditional operator ?: allows us to define expressions in Java. It's a condensed form of the if-else statement that also returns a value.
Every expression in Java has a type. There are some complicated rules in the Java Language Specification, in the section on the conditional operator that tell us how to find the type of a conditional expression such as 5 > 8 ? 5 : "ha"
. But in simple terms, you always get the most specific type that both the second and third arguments are members of.
5 > 8 ? 5 : 8
, both 5
and 8
are int
, so this whole expression has type int
.5 > 8 ? "he" : "ha"
, both "he"
and "ha"
are String
, so this whole expression has type String
.5 > 8 ? 5 : "ha"
, the most specific type that fits both 5
and "ha"
is Object
. So this whole expression has type Object
.Now since you have versions of test
that accept int
and accept String
, the expressions test ( 5 > 8 ? 5 : 8 )
and test ( 5 > 8 ? "he" : "ha" )
both compile.
But if you don't have a version of test
that accepts Object
, then test ( 5 > 8 ? 5 : "ha" )
can't compile.
This is an over-simplification. The rules are significantly more complicated than I've described, but this is mostly because they consider the various cases involving null
operands, auto-boxing and auto-unboxing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With