avro-tools превращает типы объединения в java.lang.Object
Это .avpr
Файл протокола Avro определяет одно сообщение, получающее и возвращающее тип объединения:
{
"protocol": "Foo",
"types": [
{"name": "A", "type": "record",
"fields": [{"name": "x", "type": "int"}]},
{"name": "B", "type": "record",
"fields": [{"name": "y", "type": "double"}]}
],
"messages": {
"bar": {
"request": [{"name": "a_or_b", "type": ["A", "B"]}],
"response": ["A", "B"]
}
}
}
Давайте пройдем через это avro-tools
:
$ java -jar avro-tools-1.7.7.jar compile protocol test.avpr .
A.java
а также B.java
не удивительно Но Foo.java
выглядит так:
/**
* Autogenerated by Avro
*
* DO NOT EDIT DIRECTLY
*/
@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public interface Foo {
public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"Foo\",\"namespace\":null,\"types\":[{\"type\":\"record\",\"name\":\"A\",\"fields\":[{\"name\":\"x\",\"type\":\"int\"}]},{\"type\":\"record\",\"name\":\"B\",\"fields\":[{\"name\":\"y\",\"type\":\"double\"}]}],\"messages\":{\"bar\":{\"request\":[{\"name\":\"a_or_b\",\"type\":[\"A\",\"B\"]}],\"response\":[\"A\",\"B\"]}}}");
java.lang.Object bar(java.lang.Object a_or_b) throws org.apache.avro.AvroRemoteException;
@SuppressWarnings("all")
public interface Callback extends Foo {
public static final org.apache.avro.Protocol PROTOCOL = Foo.PROTOCOL;
void bar(java.lang.Object a_or_b, org.apache.avro.ipc.Callback<java.lang.Object> callback) throws java.io.IOException;
}
}
Почему мой A
-или же- B
значения превращаются в java.lang.Object
? Я ожидал бы универсальный тип T<A, B>
у него есть полезные методы для создания и проверки моих значений типа union.
Что мне делать с Object
Я получаю аргумент, чтобы различать A
а также B
типы, а какое значение я должен вернуть?
Погуглив, я нашел метод под названием resolveUnion
в GenericData
, Это уместно здесь? Если да, то как мне его использовать?