4

(これはとですJava 7

すべてのサブクラスにほぼ同一のコードを含めるのではなく、基本クラスにJSON文字列生成メソッドを配置しようとしていました。私が試した最初の素朴なことは次のとおりです。

public abstract class Base
{
    [rest of class...]

    final public <T extends Base> String toJsonString() throws IOException {
        JacksonRepresentation<T> rep =
             new JacksonRepresentation<>(MediaType.APPLICATION_JSON, this);
        return rep.getText();
    }    
}

しかし、それはコンパイルされず、エラーが発生します:

error: incompatible types
required: JacksonRepresentation<T>
found:    JacksonRepresentation<Base>
where T is a type-variable:
T extends Base declared in method <T>toJsonString()

だから私はこれを試しました:

public abstract class Base
{
    [rest of class...]

    final public String toJsonString() throws IOException {
        return jsonStringHelper(this);
    }

    private static <T extends Base> String jsonStringHelper(T object)
        throws IOException {
        JacksonRepresentation<T> rep =
             new JacksonRepresentation<>(MediaType.APPLICATION_JSON, object);
        return rep.getText();
    }
}

そしてそれはうまくいきました。何故ですか?thisコンパイラは、の型が満たされT extends Base、必要な解決を行う型であることを認識できない/できないのはなぜですか?

4

1 に答える 1

6

どちらもベースを拡張するClass1とClass2を持つことができ、誰かがこれを行うことができるためです。

Class1 class1 = new Class1();

String result = class1.<Class2>jsonStringHelper();

したがって、「this」がBaseのサブクラスであることが保証されていますが、「this」がTのインスタンスであるという保証はありません。

于 2012-07-16T17:40:10.163 に答える