节俭类型作为通用
Thrift types as a Generic
我正在使用 Apache thrift,它生成 Java classes,看起来像这样:
public class MyEvent implements org.apache.thrift.TBase<MyEvent, MyEvent._Fields>
我想创建一个容器 class,它采用实现 TBase 的泛型。我想编写如下代码:
(科特林)
val msg = MyContainer<MyEvent>()
但是,我不能这样做 class MyContainer<T: TBase>
因为我需要填写 TBase 的两个参数,我做了这样的事情:
class MyContainer<T: TBase<T,F>, F: TFieldIdEnum>
然而这需要我写这样的代码:
val msg = MyContainer<MyEvent, MyEvent._Fields>()
我认为它可以工作,否则可以获得我需要的功能,但无论如何我可以更简洁地告诉 java "I need a T that implements TBase with type T and T._Fields" 这样我就可以做到 val msg = MyContainer<MyEvent>()
?
如果只是一个容器,可以使用star-projection:
class MyContainer<T: TBase<T,*>>
这将使 val msg = MyContainer<MyEvent>()
工作。当您使用反射来处理对象时,这种技术有时很有用,例如 Protobuf 和 Thrift。
但是你的问题没有给出关于你打算如何使用这个容器的提示。
我正在使用 Apache thrift,它生成 Java classes,看起来像这样:
public class MyEvent implements org.apache.thrift.TBase<MyEvent, MyEvent._Fields>
我想创建一个容器 class,它采用实现 TBase 的泛型。我想编写如下代码:
(科特林)
val msg = MyContainer<MyEvent>()
但是,我不能这样做 class MyContainer<T: TBase>
因为我需要填写 TBase 的两个参数,我做了这样的事情:
class MyContainer<T: TBase<T,F>, F: TFieldIdEnum>
然而这需要我写这样的代码:
val msg = MyContainer<MyEvent, MyEvent._Fields>()
我认为它可以工作,否则可以获得我需要的功能,但无论如何我可以更简洁地告诉 java "I need a T that implements TBase with type T and T._Fields" 这样我就可以做到 val msg = MyContainer<MyEvent>()
?
如果只是一个容器,可以使用star-projection:
class MyContainer<T: TBase<T,*>>
这将使 val msg = MyContainer<MyEvent>()
工作。当您使用反射来处理对象时,这种技术有时很有用,例如 Protobuf 和 Thrift。
但是你的问题没有给出关于你打算如何使用这个容器的提示。