默认方法是我们的Java工具箱中一个不错的新工具.但是,我尝试编写一个定义default该toString方法版本的接口.Java告诉我这是禁止的,因为声明的方法java.lang.Object可能不会被default编辑.为什么会这样?
我知道存在"基类永远胜利"规则,因此默认情况下(pun;),方法的任何default实现Object都会被方法覆盖Object.但是,我认为没有理由说明Object规范中的方法不应该有例外.特别是对于toString具有默认实现可能非常有用.
那么,Java设计者决定不允许default方法覆盖方法的原因是什么Object?
所以,我有一个需要实现的一堆方法的接口,方法名称是无关紧要的.
实现此接口的对象通常被放入集合中,并且还具有我希望它们使用的特殊toString()格式.
所以,我认为将hashCode(),equals()和toString()放入接口会很方便,以确保我记得覆盖这些的默认方法.但是当我将这些方法添加到接口时,如果我没有实现这三个方法,IDE/Compiler就不会抱怨,即使我明确地将它们放在接口中.
为什么不对我强制执行?它抱怨如果我没有实现任何其他方法,但它没有强制执行这三个方法.是什么赋予了?有线索吗?
我正在开发一个SPI,并希望定义一个Reportable接口,这样任何实现都必须覆盖toString()有意义的东西.
在Java中有没有办法编写一个接口,使得它的任何具体实现都必须覆盖Object toString()?例如:
public interface Reportable
{
public String toString();
}
public class Widget implements Fizz, Buzz, Reportable
{
// ...
@Override
public String toString()
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我知道上面的代码不强制这种行为,但是我正在寻找的一个例子,即如果Widget不覆盖toString()你得到编译错误,因为它违反了接口契约.
我有一个抽象的父类,我希望它强制所有子类实现toString()方法.
但是放:
public abstract String toString();
Run Code Online (Sandbox Code Playgroud)
导致编译错误:
Repetitive method name/signature for method 'java.lang.String toString()' in class ...
Run Code Online (Sandbox Code Playgroud)
我相信这可能是由已经定义了toString的groovy引起的.
谢谢
java ×4
interface ×2
tostring ×2
equals ×1
grails ×1
groovy ×1
hashcode ×1
inheritance ×1
java-8 ×1
overriding ×1