当前位置: 首页 > 知识库问答 >
问题:

无法使用子类化方法专门化方法模板化

卢杰
2023-03-14
public class CSVParser {  
  protected <T extends Message> void addMessageToResult(Message message, Descriptor descriptor, ImmutableList.Builder<T> messageListBuilder) {
    . . . 
  }

对于DynamicMessage,我想使用不同的处理方式,所以我尝试了

public class CSVParserDynamicMessage extends CSVParser {
  protected<DynamicMessage> void addMessageToResult(Message message, Descriptor descriptor, ImmutableList.Builder<DynamicMessage> messageListBuilder) {
    messageListBuilder.add(DynamicMessage.parseFrom(descriptor, message.toByteString()));
}

但它给出了编译错误

com中的“addMessageToResult(Message,Descriptor,Builder)”。谷歌。云垂直方向。电信公司。taap。数据流。数据摄取。常见的解析器。CSVParserDynamicMessage与com中的addMessageToResult(Message,Descriptor,Builder)冲突。谷歌。云垂直方向。电信公司。taap。数据流。数据摄取。常见的解析器。CSVParser’;两种方法具有相同的擦除,但都不重写另一种方法

我必须执行以下丑陋的方法(尚未尝试运行,看看它是否真的有效):

@Override
  protected<T extends Message> void addMessageToResult(Message message, Descriptor descriptor, ImmutableList.Builder<T> messageListBuilder)
    throws InvalidProtocolBufferException {
    messageListBuilder.add((T) DynamicMessage.parseFrom(descriptor, message.toByteString()));
}

请注意,我的子类化尝试是受Java泛型(模板)专业化的启发(用特定类型覆盖模板类型),但不同之处似乎在于,在我的例子中,模板参数T不存在于类级别,而只存在于方法级别。我无法理解为什么它不适用于我的用例。

非常感谢您的任何想法。

共有1个答案

农飞星
2023-03-14

错误消息中详细描述了该问题:由于泛型类型擦除,不能有两个名称相同的方法和仅在泛型类型参数上不同的参数。

例如,这两种方法将发生冲突(即,它们的签名将被视为相同):

public void doIt(List<Integer> list) {}
public void doIt(List<String> list) {}

因为在运行时,只有一个列表

补救措施:方法签名应根据方法名称或参数集(不考虑泛型类型参数)有所不同。

 类似资料:
  • 问题内容: 这是我的代码: 它运作良好。但是当我尝试添加这个 我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething <0>»之前的无效显式专门化与任何模板声明都不匹配 我使用g ++ 4.6.1应该怎么做? 问题答案: 不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理: C ++ 11 14.7

  • 我有几个模板参数的模板结构 此结构适用于所有模板,但结果无效的情况除外。我知道,不能实现为void类型,所以我当前的解决方案是使用如下的部分专门化: 这允许执行以下操作: 有没有一种方法可以使编译而不会在C 14标准中进行部分类特化?我可以使用和类型trait组合,但我想找到是否有一种方法: > 模板类方法的特殊化部分显式 模板类方法的实例化

  • 考虑以下头文件和源文件: 我在

  • 我有这样的代码: 这段代码的目的是:如果是或的子类,则将推导为,否则推导为

  • 问题内容: 请考虑以下情况: 现在,我想定义一个扩展“动物”类的“鸟”类,以确保当鸟吃时,它只吃BirdFeed。 一种解决方案是指定一种合同,其中“ eat”的调用者必须传递适当提要的实例。 将参数的责任委托给调用者是否可以接受?如何强制调用者传递参数的特殊化?有替代设计解决方案吗? 问题答案: 您需要向该类添加类型变量: 然后,您可以将子类声明为需要特定类型的: