16

私はSPIを開発していて、実装が意味のあるものにReportableオーバーライドしなければならないようなインターフェースを定義したいと思います。toString()

その具体的な実装のいずれかがオブジェクトをオーバーライドしなければならないtoString()ようなインターフェースを書く方法はJavaにありますか?例えば:

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 に答える