将 Frege 列表转换为 Java 数组

Converting a Frege List to a Java Array

假设我在 Frege

中定义了一个小的、有点冗余的桥接函数
listToArray :: (PrimitiveArrayElement α) => [α] -> JArray α
listToArray = arrayFromList

和一些 Java 代码将已经获得的 TList<Long> 传递给它

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

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

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

我是否传递了错误的{上下文}/{PrimitiveArrayElement} 的实例?

原始数组类型在 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定义为原生类型,使其成为ArrayElement的实例并提供明确的装箱和拆箱功能。因为java.lang.Long是引用类型,所以作为数组元素使用没有限制。