当前位置: 首页 > 知识库问答 >
问题:

Apache Thrift,Java:对象数据类型

戚高洁
2023-03-14

关于数据类型,我坚持节俭。

现在,当我将整数值映射到节俭生成的bean时,我在idl定义中使用i32类型。

class MyBean {
  Integer i = null;
}

struct TMyBean {
  1: i32 i;
}

问题是,在TMyBean生成的bean中,i var是一个int基元类型,它将0作为默认值,而对我来说,0是一个有效值。

我尝试将可选关键字放在idl文件中,但事情没有改变,它总是int。

我该如何处理这种情况?我需要在TMyBean i var中接受null值。

谢谢你,费德拉。。

共有3个答案

郎俊雅
2023-03-14

java中的整数是一个类,而不是原语。Thrift只允许使用定义的原语i16、i32、i64、double表示数字i32 i相当于int i;如果未设置,则Java中的int始终默认为0。如果你想使用一个类,那么你必须有一个可以引用的类的节俭定义。

濮阳繁
2023-03-14

每个生成的java类(来自thrift结构)都有方法来检查是否设置了原语。它比自动装箱更麻烦,但很有效。

例如:对于具有属性myValue的thrift结构TMyBean,以下生成的Java方法将有助于检查其是否为null:isSetMyValue()如果要将原语置为null,请使用:setMyValueIsSet(false)

*我不明白为什么Thrift决定不在Java中使用可选的原语作为对象,而让自动装箱来实现它的魔力。也许是因为收藏量大?无论如何,这听起来像是另一个优先考虑的问题,即性能优于简单性。

萧懿轩
2023-03-14

“可选”关键字是正确的选择。

要测试是否设置了特定的可选字段,请使用isset标志:

struct MyBean {
  1: i32 IntValue
}

给予

public class MyBean implements org.apache.thrift.TBase<MyBean, MyBean._Fields>, java.io.Serializable, Cloneable, Comparable<MyBean> {

  // ... lots of other code omitted ...

  // isset id assignments
  private static final int __INTVALUE_ISSET_ID = 0;
  private byte __isset_bitfield = 0;

  // ... lots of other code omitted ...

  /** Returns true if field IntValue is set (has been assigned a value) and false otherwise */
  public boolean isSetIntValue() {
    return EncodingUtils.testBit(__isset_bitfield, __INTVALUE_ISSET_ID);
  }

  public void setIntValueIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __INTVALUE_ISSET_ID, value);
  }

  // ... even more code omitted ...

}
 类似资料:
  • 所以我有了这个类,我想要一个接受int的方法,并创建一个这个大小的新数组。如果我声明 这将创建一个大小为10的数组。 我试过做

  • 本文向大家介绍浅析Java中对象的创建与对象的数据类型转换,包括了浅析Java中对象的创建与对象的数据类型转换的使用技巧和注意事项,需要的朋友参考一下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据类型:基本数据类型(在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型)、引用类型和nu

  • Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。在Java中枚举类是一种类,而注解是一个接口,数组也是一个类;Java原始类型(boolean, byte, char, short, int, long, float, and double)和关键字void也被表示为Class的对象。

  • 在创建RealmConfiguration时,Swift中是否有与objectTypes参数等效的Java?https://realm.io/docs/Swift/latest/api/classes/realm/configuration.html 我正在移植一个IOS应用程序,它使用多个领域数据存储来分离只读应用程序数据和读/写用户数据,因此我需要指定哪些模型属于哪个领域,以避免当领域在第一个

  • 使用table()方法查看结构化数据并比较数据对象。 table()方法提供了一种简单的方法来查看包含类似数据的对象和数组。当调用时,它将获取到的对象属性创建为标题。每一行数据来自每个索引下的属性值。 基本示例: 记录对象的数组 在它最基本的形式中,你需要的是一个具有相同属性的对象数组。 table() 命令将完整剩下的工作: console.table([{a:1, b:2, c:3}, {a:

  • 问题内容: 我有一个奇怪的Java问题: 据我们所知: 所有Java类都扩展 所有Java类都无法扩展 然后,必须扩展,它本身就是,因此,它应该是不可能的。如何用Java实现对象? 问题答案: 是第一个规则的例外,并且没有超类。从JLS3 8.1.4开始 : extend子句不能出现在Object类的定义中,因为它是原始类并且没有直接的超类。 您也可以通过反射尝试一下: