class C implements I
означает, что должно быть отношение подтипа между C
и I
.Это означает, что объект типа C
должен использоваться везде, где требуется объект типа I
.
В вашем случае C
является более строгим, чем I
, поскольку он предъявляет более точные требования к аргументу doSomething
- I.doSomething
подходит для любого A
, но C.doSomething
требует определенногоподтип A
Обратите внимание, что если вы измените C.doSomething
для принятия любого A
, то ничто не помешает вам передать ему объект типа B
.Вы просто не можете требовать только B
, потому что тогда вы нарушите контракт подтипов.
Теоретически, подтипы могут быть более либеральными в отношении аргументов своих функций и более конкретными в отношении типов возвращаемых данных (но никогда не наоборот,как было в вашем случае).На практике язык программирования может требовать, чтобы типы аргументов в переопределенных методах были везде одинаковыми.