结构类型的映射
From OpenOffice.org Wiki
普通的 UNO 结构类型被映射成一个同名的公共 Java 类。只有对这种类的非空引用才是有效的。UNO 结构类型的每个成员都被映射成相同名称、对应类型的公共字段。该类提供一个用默认值初始化所有成员的默认构造函数,以及一个获取所有结构成员确切值的构造函数。如果一个普通结构类型继承另一个结构类型,则生成的类是被继承结构类型的类的子类。
module com { module sun { module star { module chart { struct ChartDataChangeEvent: com::sun::star::lang::EventObject { ChartDataChangeType Type; short StartColumn; short EndColumn; short StartRow; short EndRow; }; }; }; }; };
被映射成:
package com.sun.star.chart; public class ChartDataChangeEvent extends com.sun.star.lang.EventObject { public ChartDataChangeType Type; public short StartColumn; public short EndColumn; public short StartRow; public short EndRow; public ChartDataChangeEvent() { Type = ChartDataChangeType.getDefault(); } public ChartDataChangeEvent( Object Source, ChartDataChangeType Type, short StartColumn, short EndColumn, short StartRow, short EndRow) { super(Source); this.Type = Type; this.StartColumn = StartColumn; this.EndColumn = EndColumn; this.StartRow = StartRow; this.EndRow = EndRow; } }
与普通结构类型类似,UNO 多态结构类型模板也被映射成 Java 类。唯一区别在于带有参数类型的结构成员的处理方法,反过来,此处理在 Java 1.5 和旧版本之间也有所不同。
以多态结构类型模板为例:
module com { module sun { module star { module beans { struct Optional<T> { boolean IsPresent; T Value; }; }; }; }; };
在 Java 1.5 中,带有一系列类型参数的多态结构类型模板被映射成带有对应系列无约束类型参数的一
般 Java 类。对于 com.sun.star.beans.Optional,这意味着对应的 Java 1.5 类与以下示例类似:
package com.sun.star.beans; public class Optional<T> { public boolean IsPresent; public T Value; public Optional() {} public Optional(boolean IsPresent, T Value) { this.IsPresent = IsPresent; this.Value = Value; } }
这种多态结构类型模板的实例很自然地映射成 Java 1.5。例如,UNO Optional<string> 映射成 Java Optional<String>。但是,通常映射成原始 Java 类型的 UNO 类型参数映射成相应的 Java 包装类型:
-
boolean映射成java.lang.Boolean -
byte映射成java.lang.Byte -
short和unsigned short映射成java.lang.Short -
long和unsigned long映射成java.lang.Integer -
hyper和unsigned hyper映射成java.lang.Long -
float映射成java.lang.Float -
double映射成java.lang.Double -
char映射成java.lang.Character
例如,UNO Optional<long> 映射成 Java Optional<Integer>。还要注意,any 和 com.sun.star.uno.XInterface 的 UNO 类型参数都映射成 java.lang.Object</idl>,因此,<code>Optional<any> 和 Optional<XInterface> 都映射成 Java Optional<Object>。
处理默认构造的多态结构类型实例的参数成员时,仍然存在少数问题和缺陷。
- 一个问题是默认构造函数将这种成员初始化为
null,但是,除 any 的值或接口类型以外,null在 Java UNO 的环境中通常不是合法值。例如,newOptional<PropertyValue>().Value的类型为 com.sun.star.beans.PropertyValue(结构类型),但它却是一个空引用。同样,newOptional<Boolean>().Value也是一个空引用(而不是对 Boolean.FALSE 的引用)。所选的解决方案通常允许将空引用作为 Java 类字段的值,这些值与 UNO 多态结构类型的参数成员相对应。然而,为了避免出现任何问题,这种情况下最好不要依赖默认构造函数,而是要明确初始化所有有问题的字段。(请注意,这并非真正是Optional的问题,如同Optional< T >()一样。对于默认构造的实例,IsPresent 始终为 false,由于 com.sun.star.beans.Optional 的文档约定,Value的实际内容应被忽略,其他情况下,应忽略 com.sun.star.beans.Ambiguous,然而,这是一个实际问题。) - 另一个缺陷是默认构造的多态结构类型实例的类型 any 的参数成员(在 Java 1.5 中为
new Optional<Object>().Value,在 C++ 中为Optional<Any> o;o.Value)在 Java 语言绑定和 C++ 语言绑定中的值不同。在 Java 中,它包含类型XInterface的一个空引用(即 Java 值null),而在 C++ 中,它却包含void。此外,为了避免出现任何问题,这种情况下最好不要依赖默认构造函数。
在 1.5 以前的 Java 版本中(这些版本不支持一般类型 generics),多态结构类型模板以这样一种方法被映射成普通的 Java 类:任何参数成员都被映射成类 java.lang.Object 的类字段。这通常没有使用一般类型可取,因为它降低了类型安全性,但它具有与 Java 1.5 兼容的优点(实际上,单个 Java 类文件是为给定的 UNO 结构类型模板生成的,该类文件适用于 Java 1.5 和旧版本)。在 1.5 以前的 Java 版本中,Optional 示例如下:
package com.sun.star.beans; public class Optional { public boolean IsPresent; public Object Value; public Optional() {} public Optional(boolean IsPresent, Object Value) { this.IsPresent = IsPresent; this.Value = Value; } }
如何使用 java.lang.Object 表示任意 UNO 类型的值,其详细介绍如下:
- UNO 类型
boolean、byte、short、long、hyper、float、double和char的值通过对应的 Java 类型java.lang.Boolean、java.lang.Byte、java.lang.Short、java.lang.Integer、java.lang.Long、java.lang.Float、java.lang.Double和java.lang.Character的非空引用表示。 - UNO 类型
unsigned short、unsigned long和unsigned hyper的值通过对应的 Java 类型java.lang.Short、java.lang.Integer和java.lang.Long的非空引用表示。这样的 Java 类型的值是对应于有符号的 UNO 类型还是无符号的 UNO 类型必须从环境推算。 - UNO 类型
string、type、any和 UNO 序列、枚举、结构和接口类型(全部映射成 Java 引用类型)的值用其标准的 Java 映射来表示。 - UNO 类型 void 和 UNO 异常类型不能用作实例化多态结构类型的类型参数。
这与如何使用 java.lang.Object 表示 UNO any 类型的值类似。这里区别之处只有 com.sun.star.uno.Any,它可以用来消除不同的 UNO 类型映射成 java.lang.Object 的同一个子类的情况。相反,在此,它必须始终是从给定的 Java 引用表示的 UNO 类型的环境中推算。
对于默认构造的多态结构类型实例的参数成员,Java 1.5 中所提到的问题和缺陷也适用于 Java 旧版本。
| Content on this page is licensed under the Public Documentation License (PDL). |

