为什么在具体实现方法签名中没有继承最终参数修饰符?

Ben*_*Ben 3 java intellij-idea

考虑到我们有一个这样的方法签名

public abstract class BaseClass {
    protected abstract void doStuff(final MyArg arg);
}
Run Code Online (Sandbox Code Playgroud)

为什么具体实现不再需要实现final方法签名中的修饰符?

public class ConcreteClass extends BaseClass {

    @Override
    protected void doStuff(MyArg arg) {
        // TODO
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我知道你仍然可以final在具体签名中提出论点,但你为什么不被迫呢?跳过它的原因是什么,还有一个问题,为什么代码生成器Intellij也默认跳过它?

Joa*_*uer 6

参数是否final存在对方法的调用者绝对没有影响。

它纯粹是一个标志,表明在方法的主体内不应更改参数。

由于任何此类更改仅在方法主体内可见,因此调用者无法关心(或观察)参数是否为最终参数。

一个方法签名只取决于参数类型。它不依赖于参数名称或final关键字的存在。

  • @Ben 它绝对一无所获。语言设计者只是对接口参数使用与类参数相同的语法,并且没有添加阻止“抽象”方法上的“final”的规则。 - - 为什么不?他们或许根本没有想到。 (3认同)