类型映射

From Apache OpenOffice Wiki
Jump to: navigation, search



简单类型的映射

下表所示为 UNO 简单类型对应的 Java 类型映射。

UNO Java
void void
boolean boolean
byte byte
short short
unsigned short short
long int
unsigned long int
hyper long
unsigned hyper long
float float
double double
char char
string java.lang.String
type com.sun.star.uno.Type
any java.lang.Object/com.sun.star.uno.Any


除以下各节中介绍的几种情况以外,对应的 UNO 和 Java 类型的值之间的映射非常明显:

无符号的整数类型的映射

无符号的 UNO 整数类型的范围从 0 到 2N − 1(包括上下限),而对应的有符号的 Java 整数类型的范围从 −2N − 1 到 2N − 1 − 1(包括上下限)(其中,对于 unsigned short、unsigned long 或 unsigned hyper,N 分别为 16、32 或 64)。映射按模 N 完成,即:0 映射为 0,2N − 1 − 1 映射为 2N − 1 − 1, 2N − 1 映射为 −2N − 1,2N − 1 映射为 -1。

使用任意已不再使用的无符号的 UNO 整数类型时,用户应谨慎。在这种情况下,用户应将有符号的 Java 整数类型的值正确表示为无符号的整数类型。


字符串的映射

除以下三个细节以外,UNO 的 string 类型和 java.lang.String 之间的映射很简单:

  • UNO 的环境中仅允许对 java.lang.String 的非空引用。
  • 可以用 java.lang.String 对象表示的字符串长度是有限的。在 Java 语言绑定的环境中使用 UNO 的较长的 string 值是错误的。
  • java.lang.String 类型的对象可以表示 UTF-16 代码单元的任意序列,而 UNO 的 string 类型值是 Unicode 标量值的任意序列。目前为止,只有当某些个别的 UTF-16 代码单元(名义上是范围为 D800-DFFF 的高低替代码点)没有对应的 Unicode 标量值,并因此在 UNO 的环境中被禁止,这才会有影响。例如,在此环境中,Java 字符串 "\uD800" 是非法的,而字符串 "\uD800\uDC00" 则是合法的。有关 Unicode 的详细信息,请访问 www.unicode.org


类型的映射

Java 类 com.sun.star.uno.Type 用于表示 UNO 类型 type,只有对 com.sun.star.uno.Type 的非空引用才是有效的。(由于历史遗留错误,com.sun.star.Type 未被声明为 final。您永远不应该在代码中派生它。)


在 Java UNO 运行时的多个地方,都有方便功能可以得到类型 java.lang.Class 的值,从理论上来说,期望得到 com.sun.star.uno.Type 的值。例如,方法 com.sun.star.uno.UnoRuntime.queryInterface 有两个过载版本:一个版本带有类型 com.sun.star.uno.Type 的参数,另一个版本带有类型 java.lang.Class 的参数。有关在这种环境中如何表示 java.lang.Class 的值的详细信息,请参阅 com.sun.star.uno.Type 的文档。

任意类型的映射

存在一个专用的 com.sun.star.uno.Any 类型,但该类型不常用。API 引用中的 any 在 Java UNO 中用 java.lang.Object 表示。Object 引用可用于引用所有可能的 Java 对象。这不适用于原始类型,但是,如果需要将它们用作 any,则可以使用 Java 包装类,这些类允许将原始类型用作对象。另外,Java Object 通常通过 java.lang.Class 的一个实例来提供其类型信息。因此,一个声明如下的变量:

  Object ref;

可与所有对象一起使用,而且可通过调用以下函数来获取其类型信息:

  ref.getClass();

大多数情况下,Object 的功能足以替换 Any。尽管从 IDL 接口生成的 Java 接口不包含 Any,相反,使用 Object 引用来代替 Any。需要明确的 Any 以精确信息的情形包含无符号整数类型、除基本 XInterface 之外的所有接口类型以及 void 类型。


Documentation caution.png 然而,要实现这些接口,必须能够处理实际的 Any,这些 Any 也可以通过 Object 引用进行传送。


要简化 Any 类型的处理,请使用 com.sun.star.uno.AnyConverter 类。Java UNO 引用对此进行了说明。以下列表概括了其方法:

  static boolean isArray(java.lang.Object object) 
  static boolean isBoolean(java.lang.Object object) 
  static boolean isByte(java.lang.Object object) 
  static boolean isChar(java.lang.Object object) 
  static boolean isDouble(java.lang.Object object) 
  static boolean isFloat(java.lang.Object object) 
  static boolean isInt(java.lang.Object object) 
  static boolean isLong(java.lang.Object object) 
  static boolean isObject(java.lang.Object object) 
  static boolean isShort(java.lang.Object object) 
  static boolean isString(java.lang.Object object) 
  static boolean isType(java.lang.Object object) 
  static boolean isVoid(java.lang.Object object) 
  static java.lang.Object toArray(java.lang.Object object) 
  static boolean toBoolean(java.lang.Object object) 
  static byte toByte(java.lang.Object object) 
  static char toChar(java.lang.Object object) 
  static double toDouble(java.lang.Object object) 
  static float toFloat(java.lang.Object object) 
  static int toInt(java.lang.Object object) 
  static long toLong(java.lang.Object object) 
  static java.lang.Object toObject(Type type, java.lang.Object object) 
  static short toShort(java.lang.Object object) 
  static java.lang.String toString(java.lang.Object object) 
  static Type toType(java.lang.Object object)

当需要明确指定类型时,就需要 Java com.sun.star.uno.Any。假定有一个 C++ 组件,其接口函数在 UNOIDL 中的声明如下:

  //UNOIDL
  void foo(any arg);

相应的 C++ 实现可以是:

  void foo(const Any& arg)
  {
      const Type& t = any.getValueType();
      if (t == cppu::UnoType< XReference >::get())
      {
          Reference<XReference> myref = *reinterpret_cast<const Reference<XReference>*>(arg.getValue());
          ...
      }
  }

在示例中,检查 any 是否包含所需的接口。如果包含,则对其进行相应的指定。如果 any 包含一个不同的接口,则将查询所需的接口。如果从 Java 调用该函数,则必须提供一个对象接口。该对象可以实现多个接口,而桥使用基接口 XInterface。如果这不是所需的接口,则 C++ 实现必须调用 queryInterface 来获取所需的接口。在远程方案中,queryInterface() 调用可能会导致明显的性能损失。如果将 Java Any 用作 foo() 的一个参数,则通过桥发送需要的接口。


由于历史遗留错误,com.sun.star.uno.Any 未被声明为 final。您永远不应该在代码中派生它。

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages