我使用协议缓冲区2.6.1和Java 1.7.0.71。
编译简单的测试协议缓冲文件。
option java_package = "my.sample";
option java_outer_classname = "Sum";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
option optimize_for = SPEED;
message SumRequest {
required string family = 1;
required string column = 2;
}
message SumResponse {
required int64 sum = 1 [default = 0];
}
service SumService {
rpc getSum(SumRequest)
returns (SumResponse);
}
但是在下面的代码中,memoizedHashCode被声明为无处,因此它会抛出编译错误。
@java.lang.Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptorForType().hashCode();
if (hasFamily()) {
hash = (37 * hash) + FAMILY_FIELD_NUMBER;
hash = (53 * hash) + getFamily().hashCode();
}
if (hasColumn()) {
hash = (37 * hash) + COLUMN_FIELD_NUMBER;
hash = (53 * hash) + getColumn().hashCode();
}
hash = (29 * hash) + getUnknownFields().hashCode();
memoizedHashCode = hash;
return hash;
}
我在网上看到添加
private int memoizedHashCode = 0
解决了这个问题,但我想这只是解决方法。
为什么会这样?
答案 0 :(得分:2)
memoizedHashCode
在基类AbstractMessageLite
中定义,它是protobuf库的一部分。
您需要确保用于生成代码的protoc
版本与您带入程序的libprotobuf.jar
版本完全匹配。如果版本不匹配,您可以看到您描述的错误以及其他错误。