Java:设计接口,强制实现覆盖toString

IAm*_*aja 14 java inheritance overriding tostring

我正在开发一个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()你得到编译错误,因为它违反了接口契约.

Jon*_*eet 17

不,你不能这样做.我建议你选择一个不同的方法名称,例如

public interface Reportable
{
    String createReport();
}
Run Code Online (Sandbox Code Playgroud)

这将迫使实现编写适当的方法.toString()它的意图已经有点模糊 - 无论是用于调试表示,用户可见的表示(此时你需要问自己关于语言环境等).添加另一个含义对我来说似乎不是一个好主意.


小智 12

我的理解是你想要创建一组整齐地给出它们的字符串表示的类.因此,当System.out.println(yourobject)称之为类似的东西时,它会显示有意义的数据

您不能强制子类重写toString.但你可以这样做.

abstract class MyBase
{
    abstract String getNiceString();
    @Override
    public String toString()
    {
        return getNiceString();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 辉煌!这应该是公认的答案. (3认同)