假设我在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中,我们不能用int
或long
这样的基元类型实例化类型变量A
。
这意味着,就目前情况而言,listToArray
函数不适用于基于Java基元类型的Frege类型(据说Java 10将支持此类功能)。
对于基元类型的数组,您需要知道它是哪种类型,然后在您的情况下调用适当的方法:
PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList
还请注意,Frege目前不明确支持装箱的基元类型。这是因为这些类型是通过Javas自动装箱和自动取消装箱来支持的。
如果您确实需要一个装箱的long
数组,可以将java.lang.Long
定义为本机类型,使其成为TList<Long>
0的实例,并提供显式装箱和取消装箱功能。因为java.lang.Long
是一个引用类型,所以使用它作为数组元素没有任何限制。