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

2022-09-03 05:07:30

我正在开发一个SPI,并希望定义一个接口,以便任何实现都必须覆盖为有意义的内容。ReportabletoString()

在Java中,有没有办法编写一个接口,使得它的任何具体实现都必须覆盖Object的?例如:toString()

public interface Reportable
{
    public String toString();
}

public class Widget implements Fizz, Buzz, Reportable
{
    // ...

    @Override
    public String toString()
    {
        // ...
    }
}

我知道上面的代码不会强制这种行为,而是我正在寻找的一个例子,即如果不覆盖,你会得到编译错误,因为它违反了接口协定。WidgettoString()


答案 1

不,你不能这样做。我建议您选择其他方法名称,例如

public interface Reportable
{
    String createReport();
}

这将迫使实现编写适当的方法。 它的意图已经有些模糊 - 无论是调试表示,用户可见的表示(此时您需要询问自己有关区域设置等的信息)。添加另一种含义对我来说似乎不是一个好主意。toString()


答案 2

我的理解是,你想创建一组类,这些类整齐地给出它们的字符串表示形式。因此,当类似的东西被调用时,它会显示有意义的数据。System.out.println(yourobject)

不能强制子类覆盖 toString。但是你可以做这样的事情。

abstract class MyBase
{
    abstract String getNiceString();
    @Override
    public String toString()
    {
        return getNiceString();
    }
}