java中的@Override注释如何检查方法的拼写错误?

问题描述 投票:2回答:4

我正在查看Stackoverflow中有关@Override注释的信息。

我已经知道它会覆盖父方法。但是,我看到一些评论说@Override实际上可以检查拼写错误,并且在所有方法之前放置@override注释是非常有用的。

我想知道@Override如何检查方法名称的拼写错误。 (如果我理解正确的话)

java annotations
4个回答
5
投票

我想覆盖这个方法:

public class Foo {
    public void foo() { ... }
}

没有@Override,我仍然可以覆盖它:

public class Bar extends Foo {
    public void foo() { ... }
}

但如果我拼错了它:

public class Bar extends Foo {
    public void fooo() { ... }
}

fooo不会覆盖foo。如果我没有意识到拼写错误,我不会知道foo实际上没有被覆盖。这可能会导致错误。

如果我将@Override添加到fooo,但是:

public class Bar extends Foo {
    @Override
    public void fooo() { ... }
}

编译器会告诉我fooo不会覆盖任何东西。我会看到这个消息然后去“但它确实覆盖了foo!为什么编译器说它没有?哦等等!我拼错了它。”


3
投票

你的理解是错误的。

第一:它是@Override。 Java区分大小写,所以是的,区别很重要。其次:

我已经知道它会覆盖父方法。

不,它只是标志着它应用的方法的事实。只是因为你在方法上击败@Overrides,并不会神奇地使它覆盖某些东西。如果没有,它将导致例外。

至于检查拼写错误:假设您要覆盖toString()方法。

@Override
public String toString() {
  return "myString";
}

将成功,因为toString确实存在于父类(Object)中。

但是,当你尝试:

@Override
public String toSttring() {
  return "one t too many";
}

它将搜索父类和实现的接口。如果它无法在任何地方找到此方法签名,则会抛出异常。看来这最有可能应该是toString()而不是toSttring(),这是一个检查。

但是,它不会检查拼写。它基本上检查方法签名(包括方法名称)。

如果您尝试:

@Override
public Double toString() {
  return new Double("5");
}

除非您自己在类的父类中添加了此方法,否则这将失败,因为Objects toString返回一个String。

就像:

@Override
public String toString(String value) {
  return value;
}

由于同样的原因,很可能会失败。

编辑:只是为了澄清:@Override不做拼写检查。如果您在父类中拼错了方法名称,如果在子类中正确拼写它并添加覆盖注释,它将不起作用。


1
投票

答案很简单。

@Override注释指示编译器覆盖覆盖注释下面的方法被覆盖,即,具有匹配签名的方法应该出现在类的层次结构中的一个父类中,其中该方法在该类的层次结构中被写入。编写代码。

它会在编译器时间,层次结构(即父类,祖父类等)中检查您编写的当前方法是否具有相同签名的方法。如果不是,则会引发错误。这不是拼写检查。它是关于签名匹配,即参数的类型和顺序以及方法名称。


-1
投票

java @Override注释将确保方法签名中的任何超类更改都会导致警告,您必须进行必要的更改以确保类按预期工作。

在编译时解决潜在问题比运行时更好。因此,每当您尝试覆盖超类方法时,请始终使用java @Override注释。

© www.soinside.com 2019 - 2024. All rights reserved.