Java边界类型

Java边界类型,java,generics,bounded-types,Java,Generics,Bounded Types,我试图理解Java中的有界类型。我认为我的推理几乎是正确的,但我得到了一个错误,我不明白如果A(JsonPerson)是t(Person)的子类,为什么它会给我这个错误。 错误如下(代码中也有注释): Java public class JsonPerson extends Person implements JSONSerializableInterface<Person> { public JsonPerson(String name, String surname1,

我试图理解Java中的有界类型。我认为我的推理几乎是正确的,但我得到了一个错误,我不明白如果A(JsonPerson)是t(Person)的子类,为什么它会给我这个错误。 错误如下(代码中也有注释):

Java

public class JsonPerson extends Person implements JSONSerializableInterface<Person> {

    public JsonPerson(String name, String surname1, String surname2, String phone, String email) {
        super(name, surname1, surname2, phone, email);
    }

    /**
     * Error:(22, 16) error: incompatible types: JsonPerson cannot be converted to A
     * where A is a type-variable:
     * A extends Person declared in method <A>fromJson(JSONObject)
     * */
    @Override
    public <A extends Person> A fromJson(JSONObject json) throws JSONException {
        String name = json.getString("name");
        String surname1 = json.getString("surname1");
        String surname2 = json.getString("surname2");
        String phone = json.getString("phone");
        String email = json.getString("email");
        return new JsonPerson(name, surname1, surname2, phone, email);
    }

    @Override
    public JSONObject toJson(Person object) {
        return null;
    }
}
公共类JsonPerson扩展Person实现JSONSerializableInterface{
公共JsonPerson(字符串名称、字符串姓氏1、字符串姓氏2、字符串电话、字符串电子邮件){
超级(姓名、姓氏1、姓氏2、电话、电子邮件);
}
/**
*错误:(22,16)错误:不兼容的类型:JsonPerson无法转换为
*其中A是类型变量:
*在方法fromJson(JSONObject)中声明的扩展人员
* */
@凌驾
公共fromJson(JSONObject json)抛出JSONException{
String name=json.getString(“name”);
字符串姓氏1=json.getString(“姓氏1”);
字符串姓氏2=json.getString(“姓氏2”);
String phone=json.getString(“phone”);
String email=json.getString(“电子邮件”);
返回新的JsonPerson(姓名、姓氏1、姓氏2、电话、电子邮件);
}
@凌驾
公共JSONObject toJson(Person对象){
返回null;
}
}
JSONSerializableInterdace.java

public interface JSONSerializableInterface<T> {

    public <A extends T> A fromJson(JSONObject json) throws JSONException;

    public JSONObject toJson(T object);
}
公共接口JSONSerializableInterface{
公共fromJson(JSONObject json)抛出JSONException;
公共JSONObject toJson(T对象);
}

问题是有人可能会这样调用您的方法:

new JSONPerson().fromJSON<SpecialPerson>(json);
newjsonperson().fromJSON(json);
其中
SpecialPerson
扩展
Person
。这将是有效的(因为
A
扩展了
Person
),但是该方法返回的
JSONPerson
不是
SpecialPerson

签名

public <A extends T> A fromJson(JSONObject json)
然而,我认为最好还是这样做:

public T fromJson(JSONObject json)

所以我想我应该做一些新的A(名字,姓氏1,姓氏2,…),但我不能这样做,因为类型参数不能直接实例化,我能做什么?
public <A extends T> A fromJson(JSONObject json)
public <A extends T> A fromJson(Class<A> clazz, JSONObject json)
public T fromJson(JSONObject json)