Removing throws in overriden method, compiler wants a try/catch block when invoking

后端 未结 3 1518
轻奢々
轻奢々 2021-01-20 14:38

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

相关标签:
3条回答
  • 2021-01-20 14:52

    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.

    0 讨论(0)
  • 2021-01-20 14:57

    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.

    0 讨论(0)
  • 2021-01-20 15:13

    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();
    
    0 讨论(0)
提交回复
热议问题