Java类型转换和原始类型

Java类型转换和原始类型,java,generics,casting,Java,Generics,Casting,Builder是GeneratedMessage中的一个静态嵌套的类(它们都是抽象类)。当对GeneratedMessage.Builder类型的对象调用方法build()时,它将返回GeneratedMessage类型的对象。在下面的示例中,是否有某种方法可以声明我的原始类型T和B,这将使convert()的返回语句中的类型转换变得不必要 public class JsonStringToMessageConverter<T extends GeneratedMessage, B ext

Builder是GeneratedMessage中的一个静态嵌套的类(它们都是抽象类)。当对GeneratedMessage.Builder类型的对象调用方法
build()
时,它将返回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();
  }
}
公共类JsonStringToMessageConverter
实现IConverter{
私人最终IPbBuilderProvider m_builderProvider;
@注入
公共JSONString消息转换器(IPbBuilderProvider builderProvider){
m_builderProvider=builderProvider;
}
@凌驾
公共最终T转换(字符串值){
B builder=m_builderProvider.getPbBuilder();
试一试{
合并(值,生成器);
}捕获(解析异常){
抛出新的LoggedRuntimeException(ErrorType.PARSE_失败,e);
}
返回(T)builder.build();
}
}

GeneratedMessage
在Google的Protobuf库中定义。

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


正如我看到的那样,它不是泛型的,因此您恐怕不能这样做。

没有,因为
build
方法是在
Message.Builder
类中定义的,并且该类不是泛型的。
build
方法返回一个
Message
对象,而不是
Message
类的一般扩展。因此,
GeneratedMessage.Builder
没有泛型操作会导致
build
的方法签名返回除
Message

以外的任何内容。定义了
build()
Message.Builder
类不是泛型的。我想你的原始帖子要求了代码的副本,不是类不是泛型的语句。如果我的评论是预编辑的或我不正确,很抱歉。我不理解您关于为
build
方法使用类型参数的回答,因为它不是泛型的。请你解释一下好吗?我的意思是这是如何让它工作的。但由于它是一个第三方库,并且它没有按照应该的方式定义泛型,因此不可能避免使用未经检查的强制转换,因为库可能会从方法返回任何
消息
,因此应该在运行时检查类型。