protocol buffer 的 compile java class 有编译时错误
compile java class of protocol buffer has compile time error
我正在使用协议缓冲区 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
解决了问题,但我认为这只是解决方法。
为什么会这样?
memoizedHashCode
在基础 class AbstractMessageLite
中定义,它是 protobuf 库的一部分。
您需要确保用于生成代码的 protoc
版本与您引入程序的 libprotobuf.jar
版本完全匹配。如果版本不匹配,您可以看到您描述的错误以及其他错误。
我正在使用协议缓冲区 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
解决了问题,但我认为这只是解决方法。
为什么会这样?
memoizedHashCode
在基础 class AbstractMessageLite
中定义,它是 protobuf 库的一部分。
您需要确保用于生成代码的 protoc
版本与您引入程序的 libprotobuf.jar
版本完全匹配。如果版本不匹配,您可以看到您描述的错误以及其他错误。