I have a subclass and I am overriding the inherited parent method: I am removing the throws clause from the method declaration.
Now, using polymorphism, the my insta
That has happened because assigning the SubB
instance to a
removes the knowledge that the instance is a SubB
. As an A
, a.foo()
can now (as far as the JLS is concerned) throw Exception
.
Compile-time type knowledge is based on the declared types of the variables rather than any (hypothetical) inferred types if the variable contents.
Compiler is right. The line
A a = new SubB();
"Means "create instance of class SubB
and assign it to variable of type A
".
This means that from this point the variable a
's type is A
, not SubB
. But foo()
defined in A
throws unchecked Exception that must be re-thrown or caught by caller. This is what compiler tells you.
At line
a.foo()
compiler already "does not know" that the real instance type is SubB
. It treats it as A
.
The compiler ses an A
which does throw an Exception. If you however told the compiler it's an actual SubB
object it will stop complaining
SubB b = new SubB();
b.foo();