我正在尝试将从ceylon.interop.java {CeylonList}派生的锡兰类放置到包含此派生的锡兰模块之外的Java单元(按锡兰术语,这将被称为模块,但Java尚未如此)。锡兰类。
run.ceylon:
import java.util {
JList=List
}
import ceylon.interop.java {
CeylonList
}
// CL is deliberately annotated as 'shared' - this is the crucial point !!
shared class CL(JList<out Integer> jil) extends CeylonList<Integer>(jil) {}
为了使导入的模块在Java端可见,我在模块描述符中将导入的模块注释为“共享”。
module.ceylon:
native ("jvm") module com.example.simple "1.0.0" {
shared import "java.base" "8";
shared import ceylon.collection "1.2.2";
shared import ceylon.interop.java "1.2.2";
}
但是编译器仍然报告错误:
source/com/example/simple/run.ceylon:18: error: supertype of type 'CL' that is visible outside this module comes from an imported module that is not re-exported: 'Collection<Integer>' involves an unexported type declaration
shared class CL(JList<out Integer> jil) extends CeylonList<Integer>(jil) {}
^
source/com/example/simple/run.ceylon:18: error: supertype of type 'CL' that is visible outside this module comes from an imported module that is not re-exported: 'List<Integer>' involves an unexported type declaration
shared class CL(JList<out Integer> jil) extends CeylonList<Integer>(jil) {}
^
source/com/example/simple/run.ceylon:18: error: supertype of type 'CL' that is visible outside this module comes from an imported module that is not re-exported: 'Correspondence<Integer,Integer>' involves an unexported type declaration
shared class CL(JList<out Integer> jil) extends CeylonList<Integer>(jil) {}
^
source/com/example/simple/run.ceylon:18: error: supertype of type 'CL' that is visible outside this module comes from an imported module that is not re-exported: 'Ranged<Integer,Integer,List<Integer>>' involves an unexported type declaration
shared class CL(JList<out Integer> jil) extends CeylonList<Integer>(jil) {}
解决方案应该是重新导出ceylon.language
...
shared import ceylon.language "1.2.2";
...
但是,一方面,ceylon.language根本不允许导入,因此无法进行注释,也不能重新导出。
另一方面,我找不到任何“ ...未重新导出的导入模块...”,因为所有导入的模块都标注为共享。
另外:来自run.ceylon的类CL然后被导入并在Use.java中使用
Use.java:
package some.other.package
// And thus some.other.module if there were
import com.example.simple.*;
import java.util.* ;
public class Use{
public static void main (String[] args) {
LinkedList ll = new LinkedList();
ll.add(1);
ll.add(2);
CL c = new CL(ll);
}
}
现在的问题是(参考上面的错误消息),
1.在此模块外部可见哪些类型为“ CL”的超类型,并且来自未重新导出的导入模块,以及
2.如何转口呢?
最佳答案
在Ceylon 1.2.2中,您的示例将不起作用,因为Java代码无法在同一模块中使用Ceylon声明。
在尚未发布的Ceylon 1.2.3中,应该支持此功能,但是我遇到的错误与您相同,并且示例代码没有发现任何错误。
关于java - Ceylon和Java之间的互操作性:如何共享“ceylon.language”的导入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38795586/