16

我正在开发一个 SPI 并想定义一个Reportable接口,以便任何实现都必须覆盖toString()有意义的东西。

Java中有什么方法可以编写一个接口,使其任何具体实现都必须覆盖Object的toString()?例如:

public interface Reportable
{
    public String toString();
}

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

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

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

4

2 回答 2

18

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

public interface Reportable
{
    String createReport();
}

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

于 2012-04-07T12:20:34.043 回答
12

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

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

abstract class MyBase
{
    abstract String getNiceString();
    @Override
    public String toString()
    {
        return getNiceString();
    }
}
于 2012-09-10T14:18:06.200 回答