Объекты:
Код: Выделить всё
public abstract class BaseObject {
public String someField;
}
public class ConcreteObjectOne extends BaseObject {}
public class ConcreteObjectTwo extends BaseObject {}
Код: Выделить всё
public abstract class BaseService {
public T deserializeObjectFail(String json) throws JsonProcessingException {
var mapper = JsonMapper.builder().build();
return mapper.readValue(json, new TypeReference() {});
}
public T deserializeObjectSuccess(String json, TypeReference typeReference) throws JsonProcessingException {
var mapper = JsonMapper.builder().build();
return mapper.readValue(json, typeReference);
}
}
public class ConcreteServiceOne extends BaseService {}
public class ConcreteServiceTwo extends BaseService {}
Код: Выделить всё
var serviceOne = new ConcreteServiceOne();
var serviceTwo = new ConcreteServiceTwo();
// These fail with an InvalidDefinitionException
serviceOne.deserializeObject("{\"someField\":\"one\"}");
serviceTwo.deserializeObject("{\"someField\":\"two\"}");
// These succeed
serviceOne.deserializeObjectFixed("{\"someField\":\"one\"}", new TypeReference() {});
serviceTwo.deserializeObjectFixed("{\"someField\":\"two\"}", new TypeReference() {});
Поэтому не следует использовать new TypeReference() {} сможете ли использовать типы, предусмотренные для T, в конкретных классах? Почему это не сработает, если использование TypeReference в качестве параметра, предоставляемого конкретными классами, работает, даже если конкретные классы используют вывод типа путем передачи new TypeReference() {? Похоже, что тип T должен быть выведен одинаково в обоих случаях, особенно если учесть, что во втором примере общий тип можно даже опустить.
Подробнее здесь: https://stackoverflow.com/questions/788 ... g-generics