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