Java类型转换和原始类型

时间:2011-12-13 11:06:47

标签: java generics casting

GeneratedMessage.Builder是GeneratedMessage中的静态嵌套类(它们都是抽象类)。在GeneratedMessage.Builder类型的对象上调用方法build()时,它返回一个GeneratedMessage类型的对象。是否有一些方法可以在以下示例中声明我的原始类型TB,这将使convert()的return语句中的类型转换变得不必要。

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库中定义。

2 个答案:

答案 0 :(得分:0)

您应该使用Builder中的type参数作为build()方法返回类型,并将其声明为extends GeneratedMessage

我看到build method不是通用的,所以你不能这样做,我很害怕。

答案 1 :(得分:0)

没有,因为在build类中定义了Message.Builder方法,并且该类不是通用的。 build方法返回Message对象,而不是Message类的某些通用扩展。因此,GeneratedMessage.Builder没有通用操作会导致build的方法签名返回Message以外的任何内容。