Да, вы можете сделать это. Интерфейсы - это способ в Java избежать множественного наследования, то есть объявление класса Foo
для расширения класса Bar
и реализации интерфейса Bar
означает, что у нас есть отношение "is" между Foo
и Bar
/ Baz
. Итак, «Foo
- это Bar
», а «Foo
- это Baz
», или в вашем случае Final
- это One
. Таким образом, если тип является подтипом (или в Java реализован интерфейс), подтип можно использовать вместо типа или интерфейса (см. Принцип подстановки Лискова).
Когда вы объявляете метод m1(One one)
, вы требуете, чтобы первый параметр имел тип One
, и, поскольку Final
является One
, это, очевидно, верно.
Обратите внимание, что даже если вы передаете объект типа Final
метод только «видит» интерфейсную часть объекта без его приведения.