使用来自 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 G
:gist
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)
...
有
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 G
:gist
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)
...