【问题标题】:Java typecasting and raw typesJava 类型转换和原始类型
【发布时间】:2011-12-13 11:06:47
【问题描述】:

GeneratedMessage.Builder 是 GeneratedMessage 中的一个静态嵌套类(它们都是抽象类)。当对 GeneratedMessage.Builder 类型的对象调用方法 build() 时,它会返回 GeneratedMessage 类型的对象。有没有办法在下面的例子中声明我的原始类型TB,这将使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 库中定义。

【问题讨论】:

    标签: java generics casting


    【解决方案1】:

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

    正如我所见,build method 不是通用的,所以恐怕你不能这样做。

    【讨论】:

    • 定义build()Message.Builder类不是通用的。
    • 我认为您的原始帖子要求提供代码副本,而不是声明该类不是通用的。对不起,如果我的评论是预先编辑的或者我不正确。
    • 我不明白您关于为 build 方法使用类型参数的答案,因为它不是通用的。请解释一下好吗?
    • 我的意思是应该让它发挥作用。但由于它是第 3 方库,并且没有按应有的定义泛型,因此无法避免使用未经检查的强制转换,因为库可能会从方法返回任何 Message,因此应在运行时检查类型。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2012-07-14
      • 2022-11-27
      相关资源
      最近更新 更多