【问题标题】:Type mismatch in scala with wildcardsscala中的类型不匹配与通配符
【发布时间】:2013-09-03 14:27:54
【问题描述】:

我有一段来自 java 的代码,我正试图在 scala 中实现。

java 代码,工作正常。

protected byte[] serialize(final TBase<?, ?> base) {
    try {
        return new TSerializer(new TCompactProtocol.Factory()).serialize(base);
        } catch (final TException e) {
        throw new RuntimeException(e);
      }
}

scala 代码我很想实现。

def serialize(base: TBase[_,_]): Array[Byte]={
try{
  return new TSerializer(new TCompactProtocol.Factory()).serialize(base)
}catch {
  case ex: TException => {
    throw new RuntimeException(ex.getMessage())
  }
}

}

编译器没有给我"type mismatch; found : org.apache.thrift.TBase[_$1,_$2] where type _$2, type _$1 required: org.apache.thrift.TBase[_ <: org.apache.thrift.TBase[_, _], _ <: org.apache.thrift.TFieldIdEnum]"的错误

我环顾四周,其中一个建议是使用和 some and none 类型。但不确定这是正确的做法。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我不知道为什么它被否决了。我认为这是一个有效的问题。或者我错过了一些琐碎的事情。
  • 如果您发布 TBase 或包含您正在调用的 serialize 方法的类施加的类型约束会更好。

标签: java scala thrift


【解决方案1】:

没有更多信息,这个答案只是基于错误的猜测:

type mismatch; 
found : TBase[_$1,_$2] where type _$2, type _$1
required: TBase[_ <: TBase[_, _], _ <: TFieldIdEnum]

将类型参数限制为建议的错误消息可能会解决问题:

 def serialize(base: TBase[_ <: TBase[_,_] ,_ <: TFieldIdEnum])

如果没有看到序列化方法和 TBase 类的签名,很难说出为什么会这样。我只能推测 java 通配符 带来了已经在其他地方定义的约束,而 scala existscials 没有,需要您明确声明。

另外,不要使用return 关键字。它不会做你认为它做的事情。

【讨论】:

  • 感谢@pedrofurla 你是对的。此类型约束已编译但不确定它是否确实进行了序列化。 1. 你能告诉我你是如何提出这些限制的吗?
  • 通配符不应该解决这个问题。
  • 按要求添加了更多信息
  • 我更改了返回语句,创建了一个 var 并将返回的字节分配给它。我查看了各种相同的示例。有没有完成它的原因。我正在查看文档。如果我找到有用的链接,我会发布它。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 2012-08-27
  • 2016-10-21
  • 2019-06-26
  • 2014-05-28
相关资源
最近更新 更多