将Frege列表转换为Java数组



假设我在Frege 中定义了一个小的、有点冗余的桥接函数

listToArray :: (PrimitiveArrayElement α) => [α] -> JArray α
listToArray = arrayFromList

以及将已经获得的CCD_ 1传递给它的一些Java代码

TList<Long> tl_results = ...
Long[] results = FregeStuffies.listToArray(IPrimitiveArrayElement_Long.it, Thunk.lazy(results));

Eclipse抱怨传递给FregeStuffies.listToArray的参数不适用于

listToArray(PreludeArrays.CPrimitiveArrayElement<α[],α>, Lazy<PreludeBase.TList<α>>)

我是否传入了错误的{context}/{实例PrimitiveArrayElement}?

Primitive数组类型在Java中需要一些特殊处理,这也禁止在Frege中完全通用。

原因是我们在Java中还不能将基元类型作为泛型。当我们有时

static<A> ... foo(A[] arg) { ... }

在Java中,我们不能用intlong这样的基元类型实例化类型变量A

这意味着,就目前情况而言,listToArray函数不适用于基于Java基元类型的Frege类型(据说Java 10将支持此类功能)。

对于基元类型的数组,您需要知道它是哪种类型,然后在您的情况下调用适当的方法:

PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList

还请注意,Frege目前不明确支持装箱的基元类型。这是因为这些类型是通过Javas自动装箱和自动取消装箱来支持的。

如果您确实需要一个装箱的long数组,可以将java.lang.Long定义为本机类型,使其成为TList<Long>0的实例,并提供显式装箱和取消装箱功能。因为java.lang.Long是一个引用类型,所以使用它作为数组元素没有任何限制。

最新更新