Java Apache节约多态性

Java Apache节约多态性,java,thrift,Java,Thrift,我需要有三个节俭班:ThriftClassList,ThriftClass1,ThriftClass2。根据请求中的某些条件,我需要传递到类ThriftClass1或ThriftClass2的对象ThriftClassList 所以我需要有一个节俭的定义 struct ThriftClassList { 1: required list<?> data } struct ThriftClassList{ 1:所需列表数据 } 但节俭不支持这样的定义,我只能这样做 stru

我需要有三个节俭班:ThriftClassListThriftClass1ThriftClass2。根据请求中的某些条件,我需要传递到类ThriftClass1ThriftClass2的对象ThriftClassList

所以我需要有一个节俭的定义

struct ThriftClassList {
    1: required list<?> data
}
struct ThriftClassList{
1:所需列表数据
}
但节俭不支持这样的定义,我只能这样做

struct ThriftClass1List {
    1: required list<ThriftClass1> data
}

struct ThriftClass2List {
    1: required list<ThriftClass2> data
}
struct ThriftClassList{
1:所需列表数据
}
结构ThriftClass2列表{
1:所需列表数据
}
但是我不想有两个四类,ThriftClassList和ThriftClass2List是相似的,我想有一些通配符


做两个列表类是解决这个问题的唯一方法吗?

没有内置的节约方法。关于这一限制,请记住Thrift为大约20多种语言生成代码。并非所有这些工具都支持OOP或类似的概念,更不用说多态性或泛型之类的增强概念了

可能的解决方案包括
联合
s:

struct ListElement {
    1: Foo foo  
    2: Bar bar  
    // add other elements as needed
}

struct OuterClass {
    1: list<ListElement> data
}
struct列表元素{
1:Foo-Foo
2:酒吧
//根据需要添加其他元素
}
结构外部类{
1:列表数据
}

这里唯一的缺点是,没有任何东西可以阻止您在一个列表实例中混合foo和bar。如果必须避免这种情况,可以在运行时添加代码来验证这一点,或者像在原始问题中一样定义两个不同的列表,以使其从一开始就具有类型安全性。您可以选择。

添加到@JensG答案。“多态性”的另一个选项是将每种类型都作为可选类型,并使用标志字段指示存在哪些类型

enum PersonType {
  CHILD,
  ADULT,
  EMPLOYEE,
  BOSS,
  DOCTOR
}

struct Person {
  1: i32 personId , 
  2: PersonType type, // Tells us which are set
  3: double timestamp,
  4: optional Child child
  5: optional Adult adult
  6: optional Employee employee
  7: optional Boss boss
  8: optional Doctor doctor
}

service API{
  Person GetPerson(1: i32 id)
}
那么客户端就有了一个工厂:

func getPerson(int id) *Person {

  p := thrift.GetPerson(1)
  switch p.type {
    case thrift.CHILD:
      return newChild(p)
    case thrift.ADULT:
      return newAdult(p)
    case thrift.BOSS:
      panic("Not a person")
  } 
}

这是一种混合,它打破了单一责任原则。如果你的信仰体系不这么说,没有人强迫你这样做。感谢您对一个完全正确的答案投了否决票,您只是不喜欢这个答案,因为这些参数并不适用。@Johannes Martinsson:如果其他人(当然不是OP)想要一个只有一种元素类型的列表,那么
list
就足够了。不需要任何更复杂的东西。将这两个列表放在内部忽略了一点,即我们为什么首先在这里使用
union
。最后,将该构造包装到另一个
外部
是毫无意义的——后者不再增加任何价值。底线是什么?如果您认为您有更好的答案,请在下面添加一个。但是不要试图去理解别人的答案。谢谢。一个
union
也可以是一个替代方案(但要小心),因为示例代码可能会泄露,我的用例主要是golang。此外,这张罚单已经“解决”,因此可能不是一个长期问题。