我想从包装类外部实例化一个内部非静态接口.
这可能吗?
请考虑以下代码:
shared class AOuterClass() {
Integer val = 3;
shared interface AInterface {
shared Integer val => outer.val;
}
}
void test() {
AOuterClass o = AOuterClass();
object impl satisfies ???.AInterface{}
}
Run Code Online (Sandbox Code Playgroud)
我认为object impl satisfies o.AInterface{}这是我合理的直觉,但编译器不允许它.
在像你这样的情况下是不可能的.
Ceylon规范说(第4.5.4节类继承):
嵌套类的子类必须是声明嵌套类的类型的成员,或者是声明嵌套类的类型的子类型的成员.满足嵌套接口的类必须是声明嵌套接口或声明嵌套接口的类型的子类型的类型的成员.
因此,您只能在声明类或其子类中满足嵌套接口.类似的语言用于通过新接口扩展嵌套接口.
这并没有直接提到object声明,但这些仅仅是类定义的快捷方式,稍后将在Anonymous类中进行详细说明:
以下声明:
Run Code Online (Sandbox Code Playgroud)shared my object red extends Color('FF0000') { string => "Red"; }完全等同于:
Run Code Online (Sandbox Code Playgroud)shared final class \Ired of red extends Color { shared new red extends Color('FF0000') {} string => "Red"; } shared my \Ired red => \Ired.red;
\Ired编译器分配的类型名称在哪里.
所以这也包括object声明作为你的声明.
你可以做什么(我没有测试这个):
AOuterClass.AInterface test(){
object o extends AOuterClass() {
shared object impl satisfies AInterface{}
}
return o.impl;
}
Run Code Online (Sandbox Code Playgroud)
当然,这不适用于现有AOuterClass对象,仅适用于新创建的对象.看到这允许访问对象的私有值,这似乎是一件好事.