使用来自 Java (或 scala)的类型参数调用 Ceylon 顶层函数

Calling a Ceylon toplevel function with type parameters from Java (or scala)

shared T f<T>(T t){
  return t;
}

我期待

mod.f_.f[Integer](1)

在 scala 中工作,其中 [Integer] 是类型参数。但它不接受类型参数。

以及为什么 scala 看到 getter 而不是

的函数
shared Integer(Integer) fi = f<Integer>;

我预计 整数(整数) 足以告诉编译器将函数公开给 scala。

我不了解 Scala,所以我只能帮助解决 Java 部分,但这是从 Java 调用该函数的方式:

f_.f(Integer.$TypeDescriptor$, Integer.instance(1))

或:

f_.<Integer>f(Integer.$TypeDescriptor$, Integer.instance(1))

Ceylon 具有具体化的泛型,因此类型参数变为常规参数,您必须提供类型参数的类型描述符对象。 Ceylon classes 和接口有一个静态 $TypeDescriptor$ 成员,你可以使用它;我不知道其他东西(Java classes,并集和交集类型,......)是如何工作的,但你可以在 Ceylon 中编写等效的调用并查看生成的Java 代码通过 --verbose=code.

编译

这是一个完整的工作示例,其中包含您的 f 函数和调用它的 Java class Ggist

Ceylon实际上应该满足类型安全的要求,以安全的方式处理空值。但它不会在运行时。

所以,这个问题的答案非常简单:

scala> mod.f_.f(null,3).

这真的很有趣。

当然还有更多好玩的方式:

scala> implicit def f(x:Any):com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor = com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.klass(x.getClass)

scala> mod.f_.f(List(),3)
scala> mod.f_.f(List,3)
scala> mod.f_.f(Float,3)
...