我正在尝试将从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/

10-14 02:28