Java类型转换和原始类型
Builder是GeneratedMessage中的一个静态嵌套的类(它们都是抽象类)。当对GeneratedMessage.Builder类型的对象调用方法Java类型转换和原始类型,java,generics,casting,Java,Generics,Casting,Builder是GeneratedMessage中的一个静态嵌套的类(它们都是抽象类)。当对GeneratedMessage.Builder类型的对象调用方法build()时,它将返回GeneratedMessage类型的对象。在下面的示例中,是否有某种方法可以声明我的原始类型T和B,这将使convert()的返回语句中的类型转换变得不必要 public class JsonStringToMessageConverter<T extends GeneratedMessage, B ext
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
方法使用类型参数的回答,因为它不是泛型的。请你解释一下好吗?我的意思是这是如何让它工作的。但由于它是一个第三方库,并且它没有按照应该的方式定义泛型,因此不可能避免使用未经检查的强制转换,因为库可能会从方法返回任何消息
,因此应该在运行时检查类型。