Java Typecasting и необработанные типы - PullRequest
1 голос
/ 13 декабря 2011

GeneratedMessage.Builder - это статический вложенный класс внутри GeneratedMessage (оба они являются абстрактными классами). Когда метод build() вызывается для объекта типа GeneratedMessage.Builder, он возвращает объект типа GeneratedMessage. Есть ли какой-нибудь способ объявить мои необработанные типы T и B в следующем примере, что сделало бы приведение типов в выражении возврата convert() ненужным.

public class JsonStringToMessageConverter<T extends GeneratedMessage, B extends GeneratedMessage.Builder<B>>
        implements IConverter<String, T> {
  private final IPbBuilderProvider<B> m_builderProvider;

  @Inject
  public JsonStringToMessageConverter(IPbBuilderProvider<B> builderProvider) {
    m_builderProvider = builderProvider;
  }

  @Override
  public final T convert(String value) {
    B builder = m_builderProvider.getPbBuilder();
    try {
      JsonFormat.merge(value, builder);
    } catch (ParseException e) {
      throw new LoggedRuntimeException(ErrorType.PARSE_FAILED, e);
    }
    return (T) builder.build();
  }
}

Класс GeneratedMessage определен в библиотеке Google Protobuf. * ​​1011 *

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Нет, так как метод build определен в классе Message.Builder, и этот класс не является универсальным. Метод build возвращает объект Message, а не общее расширение класса Message. Поэтому нет никаких общих манипуляций с GeneratedMessage.Builder, которые бы вызывали сигнатуру метода build, возвращающую что-либо кроме Message.

0 голосов
/ 13 декабря 2011

Вы должны использовать параметр типа в типе возврата метода Builder для build() и объявить его как extends GeneratedMessage.

Как я вижу, метод сборки не является универсальным, поэтому, боюсь, вы не сможете этого сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...