(这是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
并执行必要的解析?
答案 0 :(得分:6)
因为你可以让Class1和Class2都扩展base,而且有人可以这样做:
Class1 class1 = new Class1();
String result = class1.<Class2>jsonStringHelper();
因此,虽然保证'this'是Base的子类,但不能保证'this'是T的实例。