假设我有一个用 Frege 定义的小的、有点冗余的桥接函数
listToArray :: (PrimitiveArrayElement α) => [α] -> JArray α
listToArray = arrayFromList
和一些通过已获得的 TList<Long>
的 Java 代码对它
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 中,我们不能用 int
或 long
等原始类型实例化类型变量 A
。
这意味着,就目前而言,您的 listToArray
函数不适用于基于 Java 原始类型的 Frege 类型(据说 Java 将支持此类内容10).
对于基本类型的数组,您需要知道它是哪种类型,然后根据您的情况调用适当的方法:
PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList
另请注意,Frege 当前未明确支持盒装原始类型。这是因为这些类型是通过 Java 的自动装箱和自动拆箱自动支持的。
如果你真的需要一个装箱的long
数组,你可以将java.lang.Long
定义为一个原生类型,让它成为ArrayElement<的一个实例
并提供明确的装箱和拆箱功能。因为 java.lang.Long
是引用类型,所以作为数组元素使用没有限制。
关于java - 将 Frege 列表转换为 Java 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368309/