Following is my code snippet:
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
var output = switch (input){
case 1 -> "one";
case 2 -> '2';
case 3 -> 3.14;
default -> 10;
};
System.out.println(output);
Now if I enter 1 as input, it prints "one", for 2 it prints '2', for 3 it prints 3.14 and for the rest it prints 10.
Does this mean datatype of output is decided at runtime according to the return type?
CodePudding user response:
No, the output
variable is always determined at compile time as explained
Note that this is not a generic Object. Infact you can't reassign the output variable to a generic Object like an ArrayList.
output = new ArrayList<String>()); // It doesn't compile
while you can reassign to any Comparable Constable and Serializable, for example to a Long
output = 10L; // It compiles!
CodePudding user response:
output
is inferred to the closest common superclass of all of those types, which is the intersection of Comparable & Serializable
. That's slightly more specific than Object
, but probably not in a meaningful way in most cases.
Luckily System.out.println
accepts any old Object
, since it can toString()
any possible arguments.
'2'
is autoboxed to Character, 3.14
to Double and 10
to Integer.
So output.getClass()
would return one of four distinct things.
CodePudding user response:
The type of output
is determined at compile time as something that is Serializable
, Comparable
and Constable
, because that's the closest common ancestor to all of the result.
The object assigned to the variable is determined at runtime is one of String
, Character
, Double
or Integer
.
The actual compile type is Serializable & Comparable<? extends Serializable & Comparable<?> & Constable> & Constable
(My IDE told me that!).