3

假设我在 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<α>>)

我是否传入了错误的 {context}/{instance of PrimitiveArrayElement}?

4

1 回答 1

2

原始数组类型需要在 Java 中进行一些特殊处理,这也抑制了 Frege 中的完全泛型使用。

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

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

在 Java 中,我们不能A使用原始类型(如intor )来实例化类型变量long

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

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

PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList

还要注意,装箱的原始类型目前没有被 Frege 明确支持。这是因为这些类型是通过 Java 自动装箱和自动拆箱来支持的。

如果你真的需要一个 boxed 数组long,你可以定义java.lang.Long为本机类型,使其成为一个实例ArrayElement并提供显式的装箱和拆箱功能。因为java.lang.Long是引用类型,所以作为数组元素使用没有限制。

于 2016-05-22T01:10:46.550 回答