我想从包装类外部实例化一个内部非静态接口。
这可能吗?
请考虑以下代码:
shared class AOuterClass() {
Integer val = 3;
shared interface AInterface {
shared Integer val => outer.val;
}
}
void test() {
AOuterClass o = AOuterClass();
object impl satisfies ???.AInterface{}
}
我认为object impl satisfies o.AInterface{}
是我合理的直觉,但编译器不允许它。
答案 0 :(得分:6)
在您的情况下不可能。
Ceylon规范说(section 4.5.4 Class Inheritance):
嵌套类的子类必须是声明嵌套类或声明嵌套类的类型的子类型的类型的成员。满足嵌套接口的类必须是声明嵌套接口或声明嵌套接口的类型的子类型的类型的成员。
因此,您只能满足声明类或其子类中的嵌套接口。类似的语言用于通过新接口扩展嵌套接口。
这并没有直接提到object
声明,但这些仅仅是类定义的捷径,稍后会在Anonymous classes详细阐述:
以下声明:
shared my object red extends Color('FF0000') { string => "Red"; }
完全等同于:
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;
}
当然,这对于现有的AOuterClass
对象不起作用,仅适用于新创建的对象。看到这允许访问对象的私有值,这似乎是一件好事。