Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java/Scala中的方法定义协调thrift中的继承不足_Java_Scala_Oop_Inheritance_Thrift - Fatal编程技术网

用Java/Scala中的方法定义协调thrift中的继承不足

用Java/Scala中的方法定义协调thrift中的继承不足,java,scala,oop,inheritance,thrift,Java,Scala,Oop,Inheritance,Thrift,我已经在Thrift中定义了一组结构。从概念上讲,其中一些结构是公共父类的子类。由于Thrift不支持结构继承,因此我使用以下策略来定义结构: 例子 说A和B是父类型p的子类型。以下是我对节俭的定义: struct P { 1: i32 childType, 2: list<byte> payload } struct A { 1: i32 x } struct B { 1: i32 y } struct P{ 1:i32子类型, 2:列出有效载荷 } 结构A{

我已经在
Thrift
中定义了一组结构。从概念上讲,其中一些结构是公共父类的子类。由于
Thrift
不支持结构继承,因此我使用以下策略来定义结构:

例子 说
A
B
是父
类型p
的子类型。以下是我对节俭的定义:

struct P {
  1: i32 childType,
  2: list<byte> payload
}

struct A {
  1: i32 x
}

struct B {
  1: i32 y
}
struct P{
1:i32子类型,
2:列出有效载荷
}
结构A{
1:i32 x
}
结构B{
1:i32 y
}
类型A和B
的对象被序列化为
类型p
的记录(
有效载荷
字段将存储对象的序列化版本,
子类型
的值将指示序列化的有效载荷是
类型A还是B
)。在反序列化过程中,
childType
字段的值将指示如何反序列化
有效负载

然而,当使用面向对象语言(如Java或Scala)编写代码时,这种方法会带来困难。例如,在返回
类型P
的对象的函数中,我不能返回
类型a
类型B
的结果

问题: (i) 有没有一个建议的方法来处理这个问题?也就是说,如何协调
节俭
Java/Scala
利用继承的代码中继承的缺失


提前感谢。

我不知道Java/Scala是否有更好的方法,但在我们的例子中,添加一个指向其“超级”Thrift结构的额外Thrift结构成员就是我们想要的

struct Foo {
    1: i32 wtf
}

struct Bar {
    1 : Foo super_
    2 : double moredata
}

当然,这只是一种变通办法,但我们可以接受。

另一种变通办法是使用节俭工会,尽管工会对节俭的支持(至少在某些语言中)不是很好。看

我将您的示例稍作更改(B.y现在是字符串),以提供更好的示例。考虑这个节约文件:

struct A {
  1: i32 x
}

struct B {
  1: string y
}

union P {
    1: A a,
    2: B b
}
在thrift compiler 0.9.0生成的Java代码中,p类有多个方法可用于确定p是否包含A或B:
isSetA
/
isSetB
getA
/
getB
,并返回指定类型的枚举


生成的代码:,和

此时不存在文件A.java、B.java或p.java。