Ceylon 和 Java 之间的互操作性:如何共享来自 'ceylon.language' 的导入
Interoperability between Ceylon and Java: How to share an import from 'ceylon.language'
我正在尝试将一个从 ceylon.interop.java { CeylonList } 派生的锡兰 class 映射到一个 java 单元(在锡兰术语中,这将被称为模块,但是 java 还没有)在包含这个派生的锡兰 class.
的锡兰模块之外
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 端可见,我在模块描述符中将导入的模块注释为 'shared'。
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 中的 class 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中,这应该是支持的,但我得到了和你一样的错误,并且没有看到示例代码有任何问题。
我正在尝试将一个从 ceylon.interop.java { CeylonList } 派生的锡兰 class 映射到一个 java 单元(在锡兰术语中,这将被称为模块,但是 java 还没有)在包含这个派生的锡兰 class.
的锡兰模块之外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 端可见,我在模块描述符中将导入的模块注释为 'shared'。
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 中的 class 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中,这应该是支持的,但我得到了和你一样的错误,并且没有看到示例代码有任何问题。