java - 将 Frege 列表转换为 Java 数组

标签 java arrays list interop frege

假设我有一个用 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 中,我们不能用 intlong 等原始类型实例化类型变量 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/

相关文章:

java - 为什么在我尝试启动 jetty 时 lambda 表达式会破坏 guice 错误处理?

python - 按照元素的特定顺序对列表进行排序

java - 我需要将一个对象转换为字符串,然后通过将其转换回我的对象​​来检索它

java - 如何修复和执行此示例 Hibernate 程序以创建表

Java do while, while

javascript - 将 bool 数组数组减少为单个 bool 数组(Array<Array<boolean>> 到 Array<boolean>)

PHP 行结果不重复

c++ - 多维字符数组

list - 解释为什么不同类型的列表是一个有效的 Haskell 表达式

java - List Array Shuffle 还是用头撞墙?